给出list:
const list = [ {id: 0, val: 0, parentId: null}, {id: 1, val: 1, parentId: 0}, {id: 2, val: 2, parentId: 0}, {id: 3, val: 3, parentId: 1}, {id: 4, val: 4, parentId: 2} ]
将该list转变为树形结构:
方法一:递归,依次找到每个节点的children
function listToTree (list, parentId) {
return list.filter(item => {
if (item.parentId === parentId) {
item.children = listToTree(list, item.id)
return true
}
return false
})
}
存在问题:每找一个节点的children都需要遍历整个原list,实际上当一节点已经成为了另一个节点的children后,就不需要判断该节点是否是自己的children之一。
方法二:对象缓存节点,先将每一个节点存进对象,然后遍历每个节点,将该节点放进父节点的children
function listToTree (list, parentId) {
const obj = {}
list.forEach(item => {
item.children = []
obj[item.id] = item
})
return list.filter(item => {
if (item.parentId !== parentId) {
obj[item.parentId].children.push(item)
return false
}
return true
})
}