迭代访问对象键
问题描述:
我具有类似于以下的物体,尽管嵌套几个字母更深:迭代访问对象键
var foo = {
a:{
a:{},
b:{}
},
b:{
a:{},
b:{}
}
}
给出一个包含“一个”和'B的,例如['b','a']
任意长度的阵列,我想修改由数组字母映射的对象键。所以对于我刚刚给出的数组,我想修改foo ['b'] ['a']或foo.b.a.
我能想到的一个简单的方法来获得目标值,使用类似以下内容:
var context = foo
for(letter in array){
context = context[letter]
}
return context
这样做的问题是,如果我试图修改上下文的终值,它不会修改原始对象,这是我想要的。理想情况下,如果我有一些创建指针的方法,这将是简单的,但我不认为JavaScript有他们。
那么有什么办法可以有效地做到这一点?
答
一个可重复使用的功能,可以很容易地解决任意深度:
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预期。
'foo [letter] ='modified value'' instead,then。 –
JavaScript数组和对象总是作为引用传递,它们不会被复制。所以'context'的最终值应该是一个可以修改的对象。 – Barmar
您可以在原始数据上显示操作示例以及结果应该是什么样子?目前尚不清楚。 – Pointy