我有两个如下所示的对象:
var cache = {
'39' : { id : 39, name : 'Tom' },
'40' : { id : 40, name : 'David'},
'41' : { id : 41, name : 'Daniel'},
'356': { id :356, grp: 'ROM', fee: '$35'}
}
var tree = {
person : { id : 39 },
memberships : { id : 356 },
}
我想做的是编写一个递归函数,该函数将tree
对象作为参数,并生成一个引用/链接到中相应对象的数据结构。缓存
对象。所以最后我必须能够像这样访问用户“Tom”:tree.person.name
。
我使用递归有两个原因:
- 我实际的
tree
对象比我在这里显示的要复杂得多(它是嵌套的) - 它根据用户输入而变化,并且树的深度未知
我编写了这个递归函数来进行引用/链接:
var traverse = function (jsonObj) {
if( typeof jsonObj == "object" ) {
if(cache[jsonObj.id]){
jsonObj = Ocache[jsonObj.id];
}
$.each(jsonObj, function(k, v) {
traverse(v);
});
}
else {
// jsonObj is a number or string
}
}
然后我调用该函数,例如
traverse(tree);
但是当我使用调试器查看我的 tree
对象时,没有任何变化:tree
与以前相同。如何实现此目的并引用/链接缓存对象中的对象?
最佳答案
代码中的主要问题是 jsonObj = cache[jsonObj.id]
:在这里您将覆盖 jsonObj
, traverse
中的局部变量,这对该特定函数调用之外的任何内容都没有影响。
为了对嵌套树对象本身进行更改,您必须跟踪父对象和当前键:
var cache = {
'39' : { id: 39, name: 'Tom' },
'40' : { id: 40, name: 'David'},
'41' : { id: 41, name: 'Daniel'},
'356': { id: 356, grp: 'ROM', fee: '$35'}
};
var tree = {
person: { id: 39 },
memberships: { id: 356 },
};
function traverse(obj) {
for (var k in obj) {
var v = obj[k];
if (!v || typeof v !== 'object') continue;
if (cache[v.id]) {
obj[k] = cache[v.id];
} else {
traverse(v);
}
}
}
traverse(tree);
console.log(tree);
我添加了!v
检查因为 typeof null
是 object
,但我们不想递归到 null
.
我没有修复没有 id
的对象被视为具有 id: 'undefined'
(如果您不想这样做,请在 if (cache[v.id])
行中添加额外的检查)。
关于javascript 递归链接对象构建对象树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192814/