列表转树结构
xianghaifeng 2024-06-26 js 基础
# 实现
const createTree = function (list = []) {
const tree = [];
const map = {};
const waitPushObj = {};
list.forEach((item) => {
const newItem = {
id: item.id,
pid: item.pid,
name: item.name,
code: item.code,
children: [],
};
map[item.id] = newItem;
// 判断是否是根节点
if (item.pid === -1) {
tree.push(newItem);
} else if (map[item.pid]) {
map[item.pid].children.push(newItem);
} else {
if (!waitPushObj[item.pid]) {
waitPushObj[item.pid] = [];
}
waitPushObj[item.pid].push(newItem);
}
// 判断暂存区是否有自己的子节点
if (waitPushObj[item.id]) {
newItem.children = waitPushObj[item.id];
delete waitPushObj[item.id];
}
// 可以不加这个判断
if (!map[item.id]) {
map[item.id] = newItem;
}
});
return tree;
};
const list = [
{
id: 11,
pid: 1,
name: "张三11",
code: "11",
},
{
id: 12,
pid: 1,
name: "张三12",
code: "12",
},
{
id: 13,
pid: 1,
name: "张三13",
code: "13",
},
{
id: 21,
pid: 2,
name: "张三2",
code: "21",
},
{
id: 1,
pid: -1,
name: "张三1",
code: "1",
},
{
id: 211,
pid: 21,
name: "张三211",
code: "211",
},
{
id: 2,
pid: -1,
name: "张三2",
code: "2",
},
];
console.log(createTree(list));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86