javascript - 动态遍历未知深度的对象的键
问题描述
我有一个奇怪的问题——可能是一个愚蠢的问题——需要一些解释,所以请多多包涵。基本上,我想知道是否有一种方法可以在不使用递归的情况下在 JavaScript 中遍历未知深度的对象。
例如,假设我有一个未知深度的对象。它看起来像这样:
let obj_depth2 = {
male:
{ short: 0, tall: 0 },
female:
{ short: 0, tall: 0 }
}
或者可能是这样的:
let obj_depth3 = {
male: {
short:
{ basketball: 0, soccer: 0 },
tall:
{ basketball: 0, soccer: 0 }
},
female: {
short:
{ basketball: 0, soccer: 0 },
tall:
{ basketball: 0, soccer: 0 }
}
}
obj
也可能更深。我不会提前知道它的深度。
让我们进一步假设我将有一个arr
看起来像这样的东西,并且将匹配obj
长度的深度。
let arr_depth2 = ["male", "short"];
或者
let arr_depth3 = ["male", "tall", "basketball"];
我将有一个循环,在其中生成 1,000 个这些arr
s,然后我将使用这些 s 添加1
到obj
未知深度。所有arr
s 的长度都相同(2 或 3 或更多),并且始终与 s 的深度匹配obj
。但是深度会发生变化,我想编写一个函数来涵盖所有情况。
需要明确的是,我不会遇到obj
深度为 2 且arr
长度为 3 的情况。深度和长度将始终匹配一次所有 1,000 次迭代。
我的问题是这个。有没有办法在不使用递归的情况下遍历obj
添加1
到我需要达到的“最深”键值对的值?
我可以建造这样的东西吗?
obj["male"]["short"] += 1;
虽然我知道我可以使用递归来达到 的底部深度obj
,添加1
到正确的value
,并且随着递归函数继续return
重建,这意味着我每次都必须为每个单个值重建 并覆盖I将只是建立在上一次迭代的基础上,只是为了添加到. 只是看起来很糟糕,但也许没关系。obj
return
obj
obj
1
obj
先感谢您。
解决方案
您可以这样做.reduce()
来遍历您的对象,累加器在您的遍历中跟踪您当前的对象。当你的 reduce 完成后,它会在你的路径中拥有最内层的嵌套对象,然后你可以使用数组中的最后一个元素作为修改值的键。正如您所说,如果您对简单地改变原始对象感到满意,则无需递归:
const obj = {male:{short:{basketball:0,soccer:0},tall:{basketball:0,soccer:0}},female:{short:{basketball:0,soccer:0},tall:{basketball:0,soccer:0}}}
const arr = ["male", "tall", "basketball"];
const modify = (obj, [...keys]) => {
const last_key = keys.pop();
const last_obj = keys.reduce((o, k) => o[k], obj);
last_obj[last_key] += 1;
}
modify(obj, arr);
console.log(obj);
推荐阅读
- javascript - Google 为美国地址设置自动完成 Angular 模式验证
- rust - 返回对成员迭代器的引用
- c# - linq中默认填充Select = null
- linux - Linux - 服务器的进程数量有限
- python - 使用 vaex 连接两个数据框
- mysql - 在 MySql 查询中替换“OR EXISTS”,这样我可以获得更好的性能结果
- rest - 如果 Watch 返回的事件很多,Kubernetes Watch API 是否会占用大量内存
- python-3.x - Python ttk组合框中每个项目的悬停提示/工具提示
- python - driver.quit() 和 pkill chrome 释放内存的效果一样吗?
- amazon-web-services - AWS:从站点到站点 VPN 路由流量 --> 特定子网