创建ID不互相跟随的父子树JSON

时间:2019-03-15 16:30:36

标签: javascript json

我试图用数据库记录创建一棵树, 最初,我使用以下代码:

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(这太简单了)。 因此,如果您有帮助的话,我想知道如何使所有工作正常。 预先感谢!

1 个答案:

答案 0 :(得分: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))