[英]Walk and set value to complex Javascript object
我注意到這篇文章的以下相似之處: JavaScript對象的動態深度設置
但是,上面的帖子是基於javascript對象的已知結構和深度而不是真正動態的。 真正的動態表明你沒有任何關於結構的先驗知識,只是一條路徑和一個替代它的價值。 我在JSFiddle上創建了一個相當不錯的用例:
http://jsfiddle.net/kstubs/nJrLp/1/
function Message(message) {
$('result').insert('<div>' + message + '</div>');
}
var obj = {
"array": [1, 2, 3],
"boolean": true,
"null": null,
"number": 123,
"object": {
"a": "b",
"c": "d",
"e": "f",
"complex_array1": [{
"g": "h"
}, {
"bingo": "bongo"
}, {
"x": {
"complex_array2": [{
"h": "i"
}, {
"j": "k"
}, {
"bingo": "bongo"
}, {
"bango": "jango"
}]
}
}]
},
"string": "Hello World"
};
var list = [{
"h": "i"
}, {
"j": "k"
}];
function walk(path,value) {
var a = path.split('.');
var context = obj;
for (i = 0; i < a.size(); i++) {
context = context[a[i]];
}
}
用例:
新數組是數組列表,它應該替換complex_array2的列表。 javascript函數walk就是這樣, 遍歷 javascript對象直到滿足路徑條件,然后將值設置為傳遞給walk函數的任何值,但新值不會粘。
我知道它為什么不堅持,因為當你走過類型數組的對象時,你會失去指向原始對象的指針。 因此,挑戰是走 javascript對象而不是丟失原始對象的上下文。
謝謝你的幫助。
卡爾..
只是循環遍歷路徑中的最后一個元素。 然后最后一個元素用於循環后的賦值。
var i = 0;
for (; i < a.size() - 1; i++) {
context = context[a[i]];
}
context[a[i]] = value;
從技術上講,你可以將i
的聲明留在for
。 我發現這個更清楚了。
您的代碼無法正常工作的原因是因為您實際上正在更改本地變量指向的對象,而不是更改對您引用的對象的屬性。
context = context[a[i]];
context
是指向對象的指針,它是一個局部變量。 分配給它時,您將分配一個新的指針值,該值將丟失對前一個對象的引用。 如果要替換它,則必須從其父對象中引用它。 假設parent
是一個這樣的對象; 一旦找到目標對象的密鑰名稱(假設您已將其放在變量key
),就可以覆蓋現有值:
parent[key] = new_value;
這將取消引用parent
,找到由key
命名的屬性,並用new_value
的內存地址替換它的值(這是一個指針)。 您目前的工作原理如下:
var context = parent[key];
context = new_value;
在這種情況下,您只需更改局部變量context
的指針值,而不是parent[key]
指向的對象。
我使用輔助函數來讀取復雜的json對象。 ( http://jsfiddle.net/JBBAJ/ )
var object = {
data: {
users: [
{
firstName: "White"
},
{
firstName: "Black"
}
]
}
}
var read = function(path, obj) {
var path = path.split(".");
var item = path.shift();
if(item.indexOf("]") == item.length-1) {
// array
item = item.split("[");
var arrayName = item.shift();
var arrayIndex = parseInt(item.shift().replace("]", ""));
var arr = obj[arrayName || ""];
if(arr && arr[arrayIndex]) {
return read(path.join("."), arr[arrayIndex]);
} else {
return null;
}
} else {
// object
if(obj[item]) {
if(path.length === 0) {
return obj[item];
} else {
return read(path.join("."), obj[item]);
}
} else {
return null;
}
}
}
console.log(read("data.users[0].firstName", object)); // White
console.log(read("data.users[1].firstName", object)); // Black
console.log(read("data.test.users[0]", object)); // null
函數read接受路徑和對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.