我注意到与这篇文章的以下相似之处: 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
- 将其列表更新为新列表(新数组)
新数组是应替换 complex_array2 列表的数组列表。javascript 函数walk就是这样做的,遍历 javascript 对象直到满足路径条件,然后将值设置为传递给 walk 函数的任何值,但是新值不会保留。
我知道它为什么不粘住,因为当你走过一个数组类型的对象时,你会丢失指向原始对象的指针。因此,挑战在于遍历javascript 对象而不丢失原始对象的上下文。
感谢您的任何帮助。
卡尔..