我有一个奇怪的问题-可能是一个愚蠢的问题-需要一些解释,所以请耐心等待。基本上,我想知道是否有一种方法可以在不使用递归的情况下遍历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"];
我将有一个循环,可以生成1000个arr
,然后将这些1
添加到未知深度的obj
中。所有arr
的长度都相同(2或3,或更多),并且始终与obj
的深度匹配。但是深度会改变,我想编写一个函数来涵盖所有情况。
要清楚,我不会遇到深度为2的obj
和长度为3的arr
的情况。深度和长度始终一次匹配所有1,000次迭代
我的问题是这个。有没有一种方法可以遍历obj
并将1
添加到我不使用递归就需要到达的“最深”键值对的值中?
我可以建立这样的东西吗?
obj["male"]["short"] += 1;
尽管我知道我可以使用递归来达到obj
的底部深度,将1
添加到适当的value
,然后return
来重建{{ 1}},因为递归函数继续运行到obj
,这意味着我每次都必须为每个单个值重建return
并覆盖我以前构建的obj
迭代,只需将obj
添加到1
的一部分中即可。 似乎不好,但是也许没关系。
谢谢。
答案 0 :(得分:1)
您可以使用.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);
答案 1 :(得分:1)
如果要在适当位置修改对象,则可以使用指针将对象遍历到最后一个键的位置,然后对其进行设置。
using
答案 2 :(得分:0)
您可以使用reduce函数在描述的情况下安全地访问嵌套对象:
const getNestedObject = (nestedObj, pathArr) => {
return pathArr.reduce((obj, key) =>
(obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);
}
然后,您可以通过类似的方式访问所需的['male'] ['short']对象:
let shortMale = getNestedObject(obj_depth3, ['male', 'short'])
您可以在对象上执行所需的操作:
shortMale.basketball += 1
有关getNestedObject函数的更多信息,请参见:https://hackernoon.com/accessing-nested-objects-in-javascript-f02f1bd6387f
答案 3 :(得分:0)
这是一个公式,一旦您可以在JavaScript中调用文件夹名称,就可以获取大小未知的东西的所有部分
Object.entries(yourObject)
这将返回对象的所有数据的数组,因此您可以轻松地对其进行迭代。我将在示例中返回您的数据,以向您展示Object.entries的工作方式
const obj_depth3 = {
male: {
short:
{ basketball: 0, soccer: 0 },
tall:
{ basketball: 0, soccer: 0 }
},
female: {
short:
{ basketball: 0, soccer: 0 },
tall:
{ basketball: 0, soccer: 0 }
}
}
console.log(Object.entries(obj_depth3));
//you might still want to use another console like inspect element's own to see how the array works, but it has all the depth and stuff :)