JavaScript 数组按级别排序


我们在同一个数组中拥有具有多对一关系的数据。该组织由级别建立。某个元素的父元素始终比其本身高一个级别,并由 parentId 引用。

我们要求从该数组中获取多级数组。级别最高的元素将作为主数组,其子元素作为子数组。

如果给定的输入数组为:

const arr = [
   {
      _id: 100,
      level: 3,
      parentId: null,
   },
   {
      _id: 101,
      level: 2,
      parentId: 100,
   },
   {
      _id: 102,
      level: 2,
      parentId: 100,
   },
   {
      _id: 103,
      level: 2,
      parentId: 100,
   },
   {
      _id: 104,
      level: 1,
      parentId: 101,
   },
   {
      _id: 105,
      level: 1,
      parentId: 102,
   },
   {
      _id: 106,
      level: 1,
      parentId: 101,
   },
   {
      _id: 107,
      level: 1,
      parentId: 103,
   },
   {
      _id: 108,
      level: 1,
      parentId: 102,
   },
   {
      _id: 109,
      level: 1,
      parentId: 103,
   }
];

然后输出结构应如下所示:

                                          100
                                           |
                           ------------------------------------
                           |                |                  |
                          101              102                103
                        -------          ------              ------
                        |     |          |    |              |    |
                       104   106        105  108            107   109

示例

该代码将是:

const arr = [{
   _id: 100,
   level: 3,
   parentId: null,
},
{
   _id: 101,
   level: 2,
   parentId: 100,
},
{
   _id: 102,
   level: 2,
   parentId: 100,
},
{
   _id: 103,
   level: 2,
   parentId: 100,
},
{
   _id: 104,
   level: 1,
   parentId: 101,
},
{
   _id: 105,
   level: 1,
   parentId: 102,
},
{
   _id: 106,
   level: 1,
   parentId: 101,
},
{
   _id: 107,
   level: 1,
   parentId: 103,
},
{
   _id: 108,
   level: 1,
   parentId: 102,
},
{
   _id: 109,
   level: 1,
   parentId: 103,
}];
const prepareTree = (arr = [], root = null) => {
   let res;
   const obj = Object.create(null);
   arr.forEach(el => {
      el.children = obj[el._id] && obj[el._id].children;
      obj[el._id] = el;
      if (el.parentId === root) {
         res = el;
      }
      else {
         obj[el.parentId] = obj[el.parentId] || {};
         obj[el.parentId].children = obj[el.parentId].children || [];
         obj[el.parentId].children.push(el);
      }
   });
return res;
};
console.log(JSON.stringify(prepareTree(arr), undefined, 4));

输出

控制台中的输出将为:

{
   "_id": 100,
   "level": 3,
   "parentId": null,
   "children": [
      {
         "_id": 101,
         "level": 2,
         "parentId": 100,
         "children": [
            {
               "_id": 104,
               "level": 1,
               "parentId": 101
            },
            {
               "_id": 106,
               "level": 1,
               "parentId": 101
            }
         ]
      },
      {
         "_id": 102,
         "level": 2,
         "parentId": 100,
         "children": [
            {
               "_id": 105,
               "level": 1,
               "parentId": 102
            },
            {
               "_id": 108,
               "level": 1,
               "parentId": 102
            }
         ]
      },
      {
         "_id": 103,
         "level": 2,
         "parentId": 100,
         "children": [
            {
               "_id": 107,
               "level": 1,
               "parentId": 103
            },
            {
               "_id": 109,
               "level": 1,
               "parentId": 103
            }
         ]
      }
   ]
}

更新日期:2020 年 11 月 24 日

781 次查看

开启你的 职业生涯

完成课程获得认证

开始
广告