[英]create nested sum json object from plain array of objects based on input fields
[英]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 }
]
}
]
};
所以:
我有一個糟糕的工作 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.