const list = [
{ id: 1, value: 1 },
{ id: 2, value: 2, parentId: 1 },
{ id: 3, value: 3, parentId: 1 },
{ id: 4, value: 4, parentId: 2 },
{ id: 5, value: 7, parentId: 4 },
]
const tree = {
id: 1,
value: 1,
children: [
{
id: 2,
value: 2,
parentId: 1,
children: [
{
id: 4,
value: 4,
parentId: 2,
children: [
{
id: 5,
value: 7,
parentId: 4,
children: [],
},
],
},
],
},
{
id: 3,
value: 3,
parentId: 1,
children: [],
},
],
}
function listToTree(list) {
const tree = []
const itemsMap = new Map()
list.forEach(item => {
itemsMap.set(item.id, {...item, children: []})
})
list.forEach(item => {
const itemMap = itemsMap.get(item.id)
if(!item.parentId) {
tree.push(itemMap)
} else {
const parent = itemsMap.get(item.parentId)
if(parent) {
parent.children.push(itemMap)
}
}
})
return tree[0]
}
console.log(listToTree(list))