let list =
[
{id:0,name:'xxx',pid:null},
{id:1,name:'xxx',pid:0},
{id:2,name:'xxx',pid:0},
{id:3,name:'xxx',pid:2},
]
let tree =
[
{
id:0,
name:'xxx',
children:{
id:1,name:'xxx',children:{},
id:2,name:'xxx',children:{
id:3,name:'xxx',children:{}
}
}
}
]
思路:
- map
key 为 id
value 为 每一项,并为每一项添加 children 属性
这样可以通过 id 精准地定位到某一项 - 复制引用,而非深拷贝
这样我们在修改 map 时,也修改了结果数组 tree
步骤
- 第一次 for 循环
- map 映射 当前项的id 和 当前项
- 为每一项添加 children 属性
{
0:{id:0,name:'xxx',pid:null,children:[]},
1:{id:1,name:'xxx',pid:0,children:[]},
2:{id:2,name:'xxx',pid:0,children:[]},
3:{id:3,name:'xxx',pid:2,children:[]}
}
- 第二次 for 循环
- 根节点放入结果数组tree
- 一次添加 chilredn 属性的值
function listToTree(list) {
var map = {}, node, tree= [];
for (let i = 0; i < list.length; i ++) {
map[list[i].id] = list[i];
list[i].children = [];
}
for (let i = 0; i < list.length; i += 1) {
list[i];
if (list[i].pid !== null) {
map[list[i].pid].children.push(list[i]);
} else {
tree.push(list[i]);
}
}
return tree;
}