[英]Update nested attributes in a JavaScript object
我想以编程方式将“ hello”更改为“ hey”,该解决方案应可与任意数量的嵌套元素一起使用(我仅使用2个级别将其保持简单)。
var data = {level1: {level2 : 'hello' }};
我可以访问“数据”变量,路径(“ 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';
还是我错过了什么?
编辑:我缺少一些东西(对不起,应该先测试一下。。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.