簡體   English   中英

如何基於普通 object 創建嵌套數組

[英]How to create a nested array based on a plain object

我有一個以以下格式輸出數據的端點:

const result = [
  {id: 4, parentId: null, name: 'Fruits & Veggies'},
  {id: 12, parentId: 133, name: 'Sanguinello'},
  {id: 3, parentId: 4, name: 'Fruits'},
  {id: 67, parentId: 98, name: 'Sesame'},
  {id: 23, parentId: 3, name: 'Orange'},
  {id: 7, parentId: null, name: 'Grains'},
  {id: 134, parentId: 7, name: 'Flour'},
  {id: 3512, parentId: 23, name: 'Navel Orange'},
  {id: 98, parentId: null, name: 'Seeds'},
  {id: 4122, parentId: 58, name: 'Lamb'},
  {id: 133, parentId: 23, name: 'Blood Orange'},
];

我需要創建一個遞歸 function 來獲得一個可能無限嵌套的 object ,其格式如下:

const infiniteTreeOutput = {
  children: [
    { label: 'Fruits & Veggies', id: 4, children: [
      { label: 'Fruits', id: 3, children: [
        { label: 'Orange', id: 23, children: [
          { label: 'Navel Orange', id: 3512 },
          { label: 'Blood Orange', id: 133, children: [
            { label: 'Sanguinello', id: 12 }
           ]
          }
         ]
        }
       ]
      }
     ]
    },
   { label: 'Grains', id: 7 },
   { label: 'Seeds', id: 98, children: [
      { label: 'Sesame', id: 67 }
     ]
    }
  ]
};

所以:

  • 如果 parentId 是 null 則位於頂層(水果和蔬菜、谷物、種子)。
  • 如果給定節點沒有子節點,那么它根本不應該具有該屬性。
  • 如果存在孤立數據(例如此處沒有父對象的“羔羊”,則應忽略該對象)。

我有一個糟糕的工作 function 但我很想知道是否有可能有一個遞歸解決方案。

您可以采用不使用遞歸的簡單單循環方法,但使用 object 來保留所有節點。

 const data = [{ id: 4, parentId: null, name: 'Fruits & Veggies' }, { id: 12, parentId: 133, name: 'Sanguinello' }, { id: 3, parentId: 4, name: 'Fruits' }, { id: 67, parentId: 98, name: 'Sesame' }, { id: 23, parentId: 3, name: 'Orange' }, { id: 7, parentId: null, name: 'Grains' }, { id: 134, parentId: 7, name: 'Flour' }, { id: 3512, parentId: 23, name: 'Navel Orange' }, { id: 98, parentId: null, name: 'Seeds' }, { id: 133, parentId: 23, name: 'Blood Orange' }], tree = function (data, root) { var t = {}; data.forEach(({ id, parentId, name: label }) => { Object.assign(t[id] = t[id] || {}, { label, id }); ((t[parentId]??= { label: '', id: null, }).children??= []).push(t[id]); }); return t[root].children; }(data, null); console.log(tree);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM