更新JavaScript对象中的嵌套属性
Update nested attributes in a JavaScript object
我想通过编程将"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:我遗漏了一些东西(对不起,应该先测试一下。)
相关文章:
- 访问键中包含空格的嵌套属性
- 如何将id数组与带下划线的对象数组嵌套属性进行比较
- 正在检查对象javascript中是否存在嵌套属性
- 更新JavaScript对象中的嵌套属性
- 使用 jQuery 传递的 Rails 嵌套属性
- 如何迭代json对象的嵌套属性并创建新的数组列表
- 如何正确传递具有排列属性的嵌套属性?(JSX)
- 如何动态获取对象的嵌套属性
- AngularJS - 包含嵌套属性指令的内容
- 嵌套属性作为函数参数
- 猫鼬:嵌套属性上为空
- 如何检查主干模型中的嵌套属性是否已更改
- 在 ngRepeat 中筛选嵌套属性
- 筛选器深层嵌套属性返回空数组
- 支持流星和铁路由器中具有嵌套属性的多个参数
- 主干虹吸嵌套属性
- 访问 JavaScript 中的嵌套属性
- 在 AJAX 响应中查找嵌套属性,这是 try/catch 的情况
- 从嵌套属性数组中获取对象嵌套值
- JQuery,从嵌套属性中访问对象的根属性