更新JavaScript对象中的嵌套属性

时间:2012-08-20 06:50:40

标签: javascript

我想以编程方式将'hello'更改为'hey',该解决方案应该适用于任意数量的嵌套元素(我只使用2个级别来保持简单)。

var data = {level1: {level2 : 'hello' }};

我可以访问'data'变量,路径('level1 / level2')和新值('hey')。

我试着这样做:

var parents = 'level1/level2'.split('/');
var target = data;
for(var i=0; i<parents.length; i++){
   target = data[parents[i]];
}
target = 'hey';

想法是前往根

target = data

然后1级深

target = data['level1'] 

...继续前进

target = data['level1']['level2'] //data['level1'] === target

并修改内容

target = 'hey'

但是当我这样做时,它似乎失去了对原始对象(数据)的引用(target = target ['level2'])。

我想我可以用路径构建一个字符串,然后对其进行评估:

eval("data['level1']['level2']='hey');

有没有更好的解决方案,不涉及eval()?

2 个答案:

答案 0 :(得分:4)

有两个问题。首先是你在循环中继续使用data,这意味着你正在尝试访问顶级键而不是内键。将target = data[parents[i]];更改为

target = target[parents[i]];

第二个是,当您更改变量target时,您不会更改data变量,而是更改target。如果您先退出循环一次迭代,则可以更新存储为引用的对象:

for(var i=0; i<parents.length-1; i++){
   target = target[parents[i]];
}
target[parents[i]] = 'hey';

演示:http://jsfiddle.net/Lherp/

答案 1 :(得分:1)

尝试这样的事情:

var data = {level1: {level2 : 'hello' }};
var parents = 'level1/level2'.split('/');
var target = data;
for(var i=0; i < parents.length - 1; i++){
   target = target[parents[i]];
}
target[parents[i]] = 'hey';

或者我错过了什么?

编辑:我遗失了一些东西(对不起,应该先测试一下......)