给出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
})
}
本文探讨了两种将list转化为树形结构的方法。方法一使用递归,但效率较低,因重复遍历list。方法二利用对象缓存节点,提高了效率,避免了重复检查。这两种方法在数据结构和算法中常见于构建层级关系的数据模型。
688

被折叠的 条评论
为什么被折叠?



