我有一个相当复杂的嵌套对象,例如:
A = {b : {c : { d : [{e:false},{g:true}] } } }
通过一些算法,我找到了d
现在我有了A, Z = clone(A)
我希望能够修改d
中的Z
。我怎么能以某种方式存储d
的位置,以便我可以在Z
中找到该位置并进行修改。如果这是一个列表,我可以存储索引并在同一索引处修改。我当然可以在树上搜索d,但我不能假设唯一的属性名称,即使我可以这样也会很慢
有什么想法吗?
答案 0 :(得分:3)
当您的算法找到d
时,请创建一组属性以指定如何找到d
。在这种情况下,它看起来像这样
["b", "c", "d"]
然后你可以循环遍历集合来遍历Z
克隆d
:
properties = ["b", "c", "d"];
newD = Z;
for(var i = 0; i < properties.length; i++){
newD = newD[properties[i]];
}
答案 1 :(得分:0)
如果我理解正确,你所寻求的是通向d - “b.c.d”的道路。所以,如果你有d--
//untested, should return path in dot notation b.c.d
function findPath(o,t,n,p){
if (typeof p=='undefined') {
p='';
}
if (typeof n=='undefined') {
n='';
}
if (o===t) {
if (p=='') {
return n;
}else{
return p+'.'+n;
}
}
if (typeof o!='object') {
return p;
}
for (var i in o) {
var j=o[i];
var xp=p;
p=findPath(j,d,i,p);
if (xp!=p) {// found
return p;
}
}
return p;
}
// call it
var s=findPath(A,d);
// s="b.c.d"