Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การเรียงลำดับอาร์เรย์ JavaScript ตามระดับ


เรามีข้อมูลที่มีความสัมพันธ์แบบหนึ่งถึงหลายความสัมพันธ์ในอาร์เรย์เดียวกัน องค์กรจัดตั้งขึ้นตามระดับ parentId ขององค์ประกอบจะสูงกว่าตัวเองหนึ่งระดับเสมอและอ้างอิงโดย 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
            }
         ]
      }
   ]
}