如何构建Javascript递归树

时间:2020-10-27 15:59:25

标签: javascript arrays recursion tree

对不起,我的英语不好,希望大家理解。我有一个数组:

var data=[
{
"id": 2,
"parent_id": 1
},
{
"id": 3,
"parent_id": 2
},
{
"id": 7,
"parent_id": 3
},
{
"id": 67,
"parent_id": 1
}
]

这就是我需要的结果:

[
{
"id": 2,
"parent_id": 1,
"child":[
  {
    "id": 3,
    "parent_id": 2,
    "child":[{
      "id": 7,
      "parent_id": 3
      },
    ]}
  ]},
{
"id": 67,
"parent_id": 1
},]

我的想法是:1个方法具有相同数组的2个参数。我使用嵌套循环。如果parent_id == id,则会添加字段“子”。

const getTree = function(data, maindata){
  const result=data.forEach(item =>{
    const child=maindata.forEach(element =>{
      if(item.id === element.parent_id){
        return true;
      }
      return false
    })
    getTree(child, maindata)
    item.child = child;
  })
  return result;
}
console.log(getTree(data,data))

但是它不能正常工作。希望大家帮助。谢谢

3 个答案:

答案 0 :(得分:1)

我不确定您的原始代码应该做什么,但是您没有得到任何结果,因为data.forEach不返回任何内容。您需要首先过滤掉属于子对象的对象(我假设这是您的原始代码旨在实现的目的),然后将所有对象分配给它们的父对象,如下所示:

var data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},]

const filterData = function(data) {
  return data.filter(item => {
    let isChild = false;
    data.forEach(parent => {
      if (parent.id == item.parent_id) {
        isChild = true;
        return;
      }
    });
    return !isChild;
  });
}

const getTree = function(data, maindata){
  return data.map(item =>{
    let children = [];
    maindata.forEach(child => {
      if (item.id == child.parent_id) {
        children.push(child);
      }
    });
    if (children.length > 0) {
      item.child = getTree(children, maindata);
    }
    return item;
  });
}
console.log(getTree(filterData(data),data));

答案 1 :(得分:0)

另一种方式:

var data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},]

data.sort(byHierarchy);
var dest = [], idx = {};
for (var i of data) {
  if (i.parent_id === 1) {
    dest.push(i);
} else {
    let j = idx[i.parent_id];
    if (j.child) j.child.push(i);
    else j.child = [i];
  }
  idx[i.id] = i;
}

function byHierarchy(a, b) {
  if (a.parent_id === b.parent_id) return a.id - b.id;
  return a.parent_id - b.parent_id;
}

console.log(JSON.stringify(dest, null, 2).replace(/([{[\]}])[\s\n]+([{[\]}])/g, '$1$2'));

答案 2 :(得分:0)

我认为这是最干净的方法

const data=[{"id": 2,"parent_id": 1},{"id": 3,"parent_id": 2},{"id": 7,"parent_id": 3},{"id": 67,"parent_id": 1},]

let makeTree = (data, parent) => {
    let node = []
    data
        .filter(d => d.parent_id == parent)
        .forEach(d => {
            d.child = makeTree(data, d.id)
            node.push(d)
        })
    return node
}
console.log(JSON.stringify(makeTree(data,1),null,2))