javascript - 尝试递归地散列对象中的值
问题描述
朋友们。我正在尝试编写代码来散列 JSON 文件中的所有值,而不管文件结构如何,同时保留键和结构。我是 javascript 新手,遇到了一些麻烦。我的代码散列了 big 和 baz 的值,但没有像我想要的那样递归地散列 cat 和 bar 的值。理想情况下,我想要散列的数字和名称(big、foo 等)保持不变。太感谢了!请参阅下面的代码:
var meow = {
big: 20,
baz: {
foo: {
cat: 3,
bar: 5
}
}
};
console.log(typeof(meow.baz.foo));
function hashobj(obj)
{
var valarray = Object.keys(obj);
var zer = valarray[0];
for(var i = 0; i < valarray.length; i++)
{
var vaz = valarray[i];
if(typeof(obj[vaz] != "object"))
{
obj[vaz] = sha256(obj[vaz] + buf);
}
if(typeof(obj[vaz]) == "object")
{
console.log("HERE");
hashobj(obj[vaz]);
}
}
}
hashobj(meow);
console.log(meow);
解决方案
如果您希望递归地执行此操作,我建议使用通用转换函数来处理递归对象结构并将转换叶节点的实际工作委托给提供的函数。
在这个版本中,该transform
功能完成了所有繁重的工作。它在标量值上调用提供的函数,并在对象和数组上递归调用自身,用新值重新创建原始结构。这是非常可重复使用的。
hashObject
我们通过传递transform
一个对我们的值进行 sha256 编码的函数来创建我们的函数。
const transform = (fn) => (obj) =>
Array.isArray (obj)
? obj .map (transform (fn))
: Object (obj) === obj
? Object .fromEntries (Object .entries (obj)
.map (([k, v]) => [k, transform (fn) (v)])
)
: fn (obj)
const hashObj = transform ((n) => sha256 (String (n)))
const meow = {big: 20, baz: {foo: {cat: 3, bar: 5, qux: [1, 2, 3]}}};
// added to demonstrate arrays --------^
console .log (hashObj (meow))
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://unpkg.com/js-sha256@0.9.0/src/sha256.js"></script>
推荐阅读
- python - scrapy中的Djangoitem导入问题
- arrays - 在 Minizinc 中计算数组中出现频率最高的元素
- c# - 基于枚举的验证
- ajax - 在没有表单的情况下向服务器发送多个文件输入
- python - Django注册表单POST数据未通过生产中的视图验证?
- python-3.x - 提取元组部分以创建另外两个元组
- jmeter - 在taurus中重定向后从页面中提取信息
- php - 在 WooCommerce 3+ 中更改现有产品的产品类型
- sql-server - 我如何计算在 sql server 中按季度获得?
- python-3.x - 使用 Python 更快地读取 CSV 文件