说我有这样一个对象:
a : {
a1 : {
a2: true
}
}
Run Code Online (Sandbox Code Playgroud)
我将所有路径保存在一个数组中:
[a1, a2]
Run Code Online (Sandbox Code Playgroud)
如果我想为["a1"] ["a2"]赋值,很容易:
a["a1"]["a2"] = true;
Run Code Online (Sandbox Code Playgroud)
但是,当我有这样的3级路径时:
[a1, a2, a3]
Run Code Online (Sandbox Code Playgroud)
我必须像这样手动编写代码:
a["a1"]["a2"]["a3"] = true;
Run Code Online (Sandbox Code Playgroud)
有没有办法自动处理任何级别的路径,这样我就不必为每一个案例明确表达它?
请注意,"a"可能非常复杂,因此我只想为此特定元素赋值而不触及其余元素.
您可以使用如下路径迭代遍历对象:
function setDeepProperty(obj, path, value)
{
var curr = obj;
for (var depth = 0; depth < path.length - 1; depth++)
{
curr = curr[path[depth]];
}
curr[path[path.length - 1]] = value;
}
Run Code Online (Sandbox Code Playgroud)
这假设路径有效.path[depth] in curr如有必要,请确保.遍历的最后一步是在循环之外完成的,因为它将设置curr为基本类型而不是引用数组(如我们所愿),这意味着它不会更改原始数据.然后,按照你的例子:
var arr = {a1: {a2: { a3: false }}};
setDeepProperty(arr, ["a1", "a2", "a3"], true);
Run Code Online (Sandbox Code Playgroud)
请注意,路径中的节点是字符串.