4

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

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

我可以访问“数据”变量、路径(“级别 1/级别 2”)和新值(“嘿”)。

我试着做:

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

4

2 回答 2

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/

于 2012-08-20T07:00:04.230 回答
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';

还是我错过了什么?

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

于 2012-08-20T06:56:03.313 回答