【问题标题】:Recursively creating a JSON tree structure from arrays of objects从对象数组递归创建 JSON 树结构
【发布时间】:2012-12-14 19:42:11
【问题描述】:

这是我的数据结构:

{ projects: [
      { revisions: [
            { files: [] },
        ],
      }
  ],
  user: {}
}

在这里转到 jsFiddle:http://jsfiddle.net/winduptoy/EXdDy/

我很想递归地创建对象父级及其ids 的 JSON 层次结构。检查您的控制台。查看projects[0].revisions[0]._idTree,其中包含projects._idrevisions 作为projects,正如预期的那样。现在查看projects[0].revisions[0].files[0]._idTree,它包含projects.files 作为projects.revisions兄弟,而files 应该是 projects.revisions 的 em>。我该如何解决这个问题?

【问题讨论】:

  • 您永远不会更改传递给 recurseTree 函数的 newKey 和 newId 参数。
  • 你确定吗?我想我会的。往下看两行,我自己递归调用attachIDs(data[key][item], ...),所以在第二次递归调用中,data其实就是data[key][item]
  • 我的意思是在 recurseTree 的主体内部,它使用相同的第二个和第三个参数递归地调用自己。
  • 没错。如果tree[key] 是一个对象,我想在应用newKeynewId 之前继续深入该对象的最深层次,这似乎无关紧要,因为这些只是我的新属性申请。
  • 看起来问题出在我处理recurseTree() 函数的方式上。郑慧在这里发了一个更好的版本:stackoverflow.com/questions/14087914/…

标签: javascript arrays json object recursion


【解决方案1】:

我认为这是您应该使用的:

http://www.jstree.com/

【讨论】:

    【解决方案2】:

    请像这样重写recurseTree

    function recurseTree(tree, newKey, newId) {
        if(angular.element.isEmptyObject(tree)) {
            tree[newKey] = {_id: newId};
            return;
        } 
    
        var child = null; // find current tree's child
        for(var key in tree) {
            if (key != '_id') {
                child = tree[key]; // found a child
                break;
            }
        }
        if (child) { // recursively process on child
            recurseTree(child, newKey, newId);
        } else { // no child, so just fill the tree
            tree[newKey] = {_id: newId};
        }
    }
    

    【讨论】: