我有一个类似于下面的对象,虽然嵌套了几个字母:
var foo = {
a:{
a:{},
b:{}
},
b:{
a:{},
b:{}
}
}
给定一个任意长度的数组,包含' a' s,例如['b','a']
,我想修改由数组字母映射的对象键。所以对于我刚给出的数组,我想修改foo [' b'] [' a']或foo.b.a。
我可以想到获取目标值的简单方法,使用如下内容:
var context = foo
for(letter in array){
context = context[letter]
}
return context
这个问题是,如果我试图修改上下文的最终值,它就不会修改原始对象,这就是我想要的。理想情况下,如果我有一些创建指针的方法,这很简单,但我不认为javascript有它们。
有没有办法有效地做到这一点?
答案 0 :(得分:1)
可重复使用的功能可以轻松解析任意深度:
function resolve(path, object) {
var tob = object;
path.map(function(a) {
return (tob = tob[a]) || tob;
});
return tob;
}
var foo = {
a:{
a:{},
b:{}
},
b:{
a:{},
b:{}
}
};
var path= ['b','a'] ;
// resolve path and add a new property:
resolve(path, foo).c=123;
console.log(foo) /* shows:
{
"a": {
"a": {},
"b": {}
},
"b": {
"a": {
"c": 123
},
"b": {}
}
} */
因此我们可以看到现在有一个属性foo.b.a.c正如预期的那样。