我想以编程方式将'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()?
答案 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';
答案 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';
或者我错过了什么?
编辑:我遗失了一些东西(对不起,应该先测试一下......)