[英]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.