【问题标题】:Create Parent-Child tree JSON with IDs not following each other创建 ID 不相互跟随的父子树 JSON
【发布时间】:2019-03-15 16:30:35
【问题描述】:

我正在尝试使用数据库记录创建一棵树, 起初我使用以下代码:

Create Parent-Child tree JSON

效果很好,但是由于我可以在数据库中插入和删除树的节点,因此该功能不再起作用。 如您所见,现在我可以拥有第一个元素,其 ID 为 90,儿童宽度更小 ID。

var arry = [{
    "parentId": null,
    "moduleId": 90
 },
 {
    "parentId": 1,
    "moduleId":65
 },
 {
    "parentId": 1,
    "moduleId": 91
 },
 {
    "parentId": 65,
    "moduleId": 66
 },
 {
    "parentId": 66,
    "moduleId": 79   
 },
 {
    "parentId": 90, 
    "moduleId": 1 
 }
];

小提琴: https://jsfiddle.net/1c20hb7w/

当然,我不能更改数据库中的 ID(这太简单了)。 所以我想知道如何让一切正常工作,如果你有帮助我的轨道.. 提前致谢!

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    对于更复杂的树,我建议使用递归方法,例如:

    var arry=[{parentId:null,moduleId:90},{parentId:1,moduleId:65},{parentId:1,moduleId:91},{parentId:65,moduleId:66},{parentId:66,moduleId:79},{parentId:90,moduleId:1}];
    
    function recursiveTree(array) {
      function getChildren(parents, input) {
        return parents.map(parent => {
          const children = input.filter(x => x.parentId === parent.moduleId);
          parent.children = children;
          if(children.length === 0) {
            return parent;
          } else {
            parent.children = getChildren(children, input);
            return parent;
          }
        })	
      }
    
      const roots = array.filter(x => x.parentId === null);
      
      return getChildren(roots, array);
    }
    
    var r = recursiveTree(arry)
    console.log('array', r);
    console.log('result', JSON.stringify(r))

    【讨论】:

    • 完美运行,谢谢!我试图找到有关递归方法的资源,但很难找到而且我真的不知道从哪里开始,如果您有适合初学者的递归资源,我接受!再次感谢
    • @abvlle 你好。我不知道有什么资源可以专门学习递归。递归广泛用于函数式编程,如lispclojurescala。所以,训练一门函数式编程语言自然会增加你对递归的感觉。嘿,除了接受答案之外,如果你觉得它有用,你可以投票赞成它。 =)
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多