【问题标题】:How To Build Javascript Recursion Tree如何构建 Javascript 递归树
【发布时间】:2021-02-09 23:00:00
【问题描述】:

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

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 将添加字段“child”。

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))

但它没有按应有的方式工作。希望大家帮忙。谢谢

【问题讨论】:

    标签: javascript arrays recursion tree


    【解决方案1】:

    我认为这是最干净的方法

    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))

    【讨论】:

      【解决方案2】:

      我不确定您的原始代码应该做什么,但您没有得到任何结果,因为 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));

      【讨论】:

        【解决方案3】:

        另一种方式:

        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'));

        【讨论】:

        • 感谢您的回答。但这是示例数据,因此您的解决方案不正确。
        • 你应该给我们更好的数据,以防你认为有任何错误;-) 如果我不计算你建议的结果中的语法错误,结果是一样的。
        猜你喜欢
        • 2019-04-14
        • 1970-01-01
        • 2020-02-27
        • 2013-08-04
        • 2021-06-18
        • 2020-06-05
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多