【问题标题】:How to get desired category tree with top parent having predefined value如何获得具有预定义值的顶级父级的所需类别树
【发布时间】:2021-10-20 18:40:39
【问题描述】:

您好,我想从类别列表中获取子树。

这是我的输入数据

[
  { "parent_id": -1, "name": "Toothpaste", "id": 99 },
   {
        "parent_id": -1,
        "name": "Cake",
        "id": 3
    },
    {
        "parent_id": 3,
        "name": "Chocolate  Cake",
        "id": 4
    },
    {
        "parent_id": 3,
        "name": "Walnut Cake",
        "id": 5
    },
    {
        "parent_id": 4,
        "name": "Chocolate Cake mixin 1",
        "id": 6
    }
]

我想要的输出如下图所示

[ { "parent_id": -1, "name": "Toothpaste", "id": 99 },
   {
    "parent_id": -1,
    "name": "Cake",
    "id": 3,
    "children":[
        {
            "parent_id": 3,
            "name": "Chocolate  Cake",
            "id": 4,
            "children":[     //<--- observe this one not there in my output 
                {
                    "parent_id": 4,
                    "name": "Chocolate Cake mixin 1",
                    "id": 6
                }
            ]
        },
        {
            "parent_id": 3,
            "name": "Walnut Cake",
            "id": 5
        }
    ],
  }

]

我面临的问题是我无法将数据推送到第二级,即巧克力蛋糕正在生孩子,但我无法将其推送到巧克力蛋糕儿童中 p>

注意:解决方案必须适用于任何级别的嵌套

这是我尝试过的

function getChildrenTree(childList){
        let childMap = {};
        for(let i = 0; i < childList.length; i++){
           if(childList[i].parent_id === -1)
              childMap[childList[i].id] = {name:childList[i].name,children:[]};
          
        }
    
        for(let i = 0; i < childList.length; i++){
            if(childMap && childMap.hasOwnProperty(childList[i].parent_id) && childMap[childList[i].parent_id].hasOwnProperty('children')) childMap[childList[i].parent_id].children.push(childList[i]);
        }
         
       return Object.values(childMap);
    }

getChildrenTree([ { "parent_id": -1, "name": "Toothpaste", "id": 99 },{ "parent_id": -1, "name": "Cake", "id": 3 }, { "parent_id": 3, "name": "Chocolate  Cake", "id": 4 }, { "parent_id": 3, "name": "Walnut Cake", "id": 5 }, { "parent_id": 4, "name": "Chocolate Cake mixin 1", "id": 6 } ])

【问题讨论】:

  • 这能回答你的问题吗? Build tree array from flat array in javascript
  • 不是因为在我的情况下我可以有多个一级父级parent_id = -1
  • 在我的代码中 sn-p toothpaste 是一级父级之一
  • @James 在我的情况下,一级父母将始终拥有id=-1,否则它不是父母。在上面的评论中我犯了一个错误,而不是id 我把parent_id.

标签: javascript jquery tree


【解决方案1】:

您可以尝试以下方法。

const flat = [
  { "parent_id": -1, "name": "Toothpaste", "id": 99 },
   {
        "parent_id": -1,
        "name": "Cake",
        "id": 3
    },
    {
        "parent_id": 3,
        "name": "Chocolate  Cake",
        "id": 4
    },
    {
        "parent_id": 3,
        "name": "Walnut Cake",
        "id": 5
    },
    {
        "parent_id": 4,
        "name": "Chocolate Cake mixin 1",
        "id": 6
    }
];

const makeTree = (arr, parent) => {
  const branch = arr.filter(node => node.parent_id === parent);
  branch.forEach(node => {
    const children = makeTree(arr, node.id);
    if (children.length) {
      node.children = children;
    }
  });
  return branch;
};

const tree = makeTree(flat, -1);

console.log(tree);

【讨论】:

    【解决方案2】:

    您可以使用单个循环和对象来收集节点并通过从根节点获取所有子节点来返回一棵树。

    const
        buildTree = (data, root) => {
            var t = {};
            data.forEach(o => {
                Object.assign(t[o.id] = t[o.id] || {}, o);
                ((t[o.parent_id] ??= {}).children ??= []).push(t[o.id]);
            });
            return t[root].children
        },
        data = [{ parent_id: -1, name: "Toothpaste", id: 99 }, { parent_id: -1, name: "Cake", id: 3 }, { parent_id: 3, name: "Chocolate  Cake", id: 4 }, { parent_id: 3, name: "Walnut Cake", id: 5 }, { parent_id: 4, name: "Chocolate Cake mixin 1", id: 6 }],
        tree = buildTree(data, -1);
    
    
    console.log(tree);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 很好的解决方案!但我猜理解代码不是我们的水平,它的水平非常高。你能解释一下这两行吗Object.assign(t[o.id] = t[o.id] || {}, { ...o }); ((t[o.parent_id] ??= {}).children ??= []).push(t[o.id]);
    • 它基本上将id 作为对对象t 和父parent_id 的引用以及paren 的引用。但是对于父级,它创建的id 对象可能是看不见的,并在其中添加了子级。这是稍后使用-1 的根parent_id 获取完整树的参考。例如构建一棵只有一个随机节点的树并查看t。基本上它总是创建两个引用,一个用于父关系,另一个用于单个循环中的子关系。
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多