更新JavaScript对象中的嵌套属性

Update nested attributes in a JavaScript object

本文关键字:嵌套 属性 JavaScript 对象 更新      更新时间:2023-09-26

我想通过编程将"hello"更改为"hey",该解决方案应该与任何数量的嵌套元素一起使用(我只使用了两个级别来保持简单)。

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()的更好的解决方案?

有两个问题。首先,您在循环中一直使用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/

试试这样的东西:

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';

还是我错过了什么?

edit:我遗漏了一些东西(对不起,应该先测试一下。)