迭代访问对象键

问题描述:

我具有类似于以下的物体,尽管嵌套几个字母更深:迭代访问对象键

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有他们。

那么有什么办法可以有效地做到这一点?

+0

'foo [letter] ='modified value'' instead,then。 –

+0

JavaScript数组和对象总是作为引用传递,它们不会被复制。所以'context'的最终值应该是一个可以修改的对象。 – Barmar

+1

您可以在原始数据上显示操作示例以及结果应该是什么样子?目前尚不清楚。 – Pointy

一个可重复使用的功能,可以很容易地解决任意深度:

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预期。