javascript 递归链接对象构建对象树

标签 javascript

我有两个如下所示的对象:

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

我使用递归有两个原因:

  1. 我实际的 tree 对象比我在这里显示的要复杂得多(它是嵌套的)
  2. 它根据用户输入而变化,并且树的深度未知

我编写了这个递归函数来进行引用/链接:

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] :在这里您将覆盖 jsonObjtraverse 中的局部变量,这对该特定函数调用之外的任何内容都没有影响。

为了对嵌套树对象本身进行更改,您必须跟踪父对象和当前键:

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 nullobject ,但我们不想递归到 null .

我没有修复没有 id 的对象被视为具有 id: 'undefined' (如果您不想这样做,请在 if (cache[v.id]) 行中添加额外的检查)。

关于javascript 递归链接对象构建对象树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192814/

相关文章:

javascript - 使用 JQuery Mobile 创建 ListView 无法正常工作

javascript - jquery 将输入的值返回给 var

javascript - 在 Javascript 中找到距离半圆中心 n% 的点?

javascript - 时刻获取不同时区的时间

javascript - 表单元素迭代,在 Javascript 中

javascript - 创建 Facebook Likebox

javascript - JavaScript 中的大数组

javascript - 如果尚未通过另一个 .js 文件加载,则导入/拉入外部 .js 文件

javascript - HTML5 canvas 鼠标悬停事件

javascript - 如何有效地过滤对象的对象?