Javascript 如何组织类别集合?

Javascript 如何组织类别集合?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个类别集合及其所有子类别,我通过ajax从服务器获得这些类别。 现在我想以一种方式对它们进行排序,使每个子类别都位于相关的父类别之下 这是“所有类别”集合: [ {id: 28, name: "category1", parent_id: null}, {id: 29, name: "category2", parent_id: null}, {id: 30, name: "category3", parent_id: null}, {id: 31, na

我有一个类别集合及其所有子类别,我通过ajax从服务器获得这些类别。 现在我想以一种方式对它们进行排序,使每个子类别都位于相关的父类别之下

这是“所有类别”集合:

[
    {id: 28, name: "category1", parent_id: null},
    {id: 29, name: "category2", parent_id: null},
    {id: 30, name: "category3", parent_id: null},

    {id: 31, name: "category4", parent_id: 28},
    {id: 32, name: "category5", parent_id: 28},
    {id: 33, name: "category6", parent_id: 28},

    {id: 34, name: "category7", parent_id: 31},
    {id: 35, name: "category8", parent_id: 31},

    {id: 36, name: "category9", parent_id: 29},
]
parent\u id:null
表示它是父类别,
parent\u id
的任何其他数字都指向父类别

反正

我想用这些数据创建一个集合,如下所示:

[
    {id: 28, name: "category1", parent_id: null, 
         children : [
             {id: 31, name: "category4", parent_id: 28, [
                 children : [
                      {id: 34, name: "category7", parent_id: 31},
                      {id: 35, name: "category8", parent_id: 31},
                 ]},

             {id: 32, name: "category5", parent_id: 28},
             {id: 33, name: "category6", parent_id: 28},

         ]},

    {id: 29, name: "category2", parent_id: null, 
         children: [
             {id: 36, name: "category9", parent_id: 29},
         ]},
    {id: 30, name: "category3", parent_id: null},

]

首先,为孩子绘制一张父母地图:

 const parentChilds = new Map;

 for(const el of data){
   const pid = el.parent_id;
   if(parentChilds.has(pid)){
     parentChilds.get(pid).push(el);
   } else {
     parentChilds.set(pid, [el]);
   }
 }
现在我们只需要将子数组存储在父数组中:

 for(const el of data)
  el.children = parentChilds.get(el.id) || [];
要仅获取顶级元素,只需过滤没有父元素的元素:

 const result = data.filter(el => !el.parent_id);

实际上,您可以在一个循环中完成这一切:

 const parentChilds = new Map;
 const result = [];

 for(const el of data){
   const {id, parent_id: pid} = el;

   if(parentChilds.has(id)) {
     el.children = parentChilds.get(id);
   } else {
     parentChilds.set(id, el.children = []);
   }

   if(pid){
     if(parentChilds.has(pid)){
       parentChilds.get(pid).push(el);
     } else {
       parenChilds.set(pid, [el]);
     }
   } else {
     result.push(el);       
   }
 }

酷。我想要一个里面有特斯拉的火箭。你试过什么?很多次,社区都会回答这种问题。我不明白为什么!。。。很多类似的问题都被解决了,因为OP没有表现出任何努力。这很有趣,社区如何回答这个问题,有时会关闭它。这取决于人们醒来时是否有“帮助”的意图。所有这些答案都应该关闭@ele@JonasW。你什么意思?非常感谢。那是我的answer@hesan很乐意帮忙;)但有一个问题。第二段代码,仅当父类别在子类别之前时才有效?