Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e4a188c

Browse files
committed
feat: 标题分组
1 parent 7dd466a commit e4a188c

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

算法/标题分组.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* 需要输出
3+
[{
4+
"name": "h3"
5+
}, {
6+
"name": "h2",
7+
"child": [{
8+
"name": "h3"
9+
}]
10+
}, {
11+
"name": "h1",
12+
"child": [{
13+
"name": "h2",
14+
"child": [{
15+
"name": "h3"
16+
}, {
17+
"name": "h3"
18+
}]
19+
}, {
20+
"name": "h2",
21+
"child": [{
22+
"name": "h3"
23+
}]
24+
}]
25+
}, {
26+
"name": "h1",
27+
"child": [{
28+
"name": "h2",
29+
"child": [{
30+
"name": "h4"
31+
}]
32+
}, {
33+
"name": "h2",
34+
"child": [{
35+
"name": "h3"
36+
}]
37+
}]
38+
}]
39+
*/
40+
41+
let list = [
42+
'h3',
43+
'h2', 'h3',
44+
'h1', 'h2', 'h3', 'h3', 'h2', 'h3',
45+
'h1', 'h2', 'h4', 'h2', 'h3'
46+
]
47+
48+
function makeTree(arr) {
49+
let tree = [];
50+
let max = Infinity
51+
let prev = {};
52+
53+
arr.forEach((title) => {
54+
let level = Number(title[1]);
55+
if (level <= max) {
56+
let node = {
57+
name: title,
58+
};
59+
tree.push(node);
60+
prev.level = level;
61+
prev.node = node;
62+
max = level
63+
} else if (level === prev.level) {
64+
// 等级相同的话 上级节点的child继续增加子节点
65+
prev = prev.prev;
66+
pushNodeAndAdvanceQueue();
67+
} else if (level > prev.level) {
68+
pushNodeAndAdvanceQueue();
69+
} else {
70+
while (level <= prev.level) {
71+
// 向上回溯,找到平级的再上一层node
72+
prev = prev.prev;
73+
}
74+
pushNodeAndAdvanceQueue();
75+
}
76+
77+
function pushNodeAndAdvanceQueue() {
78+
let node = {
79+
name: title,
80+
};
81+
if (!prev.node.child) {
82+
let child = [];
83+
prev.node.child = child;
84+
}
85+
prev.node.child.push(node);
86+
let next = {
87+
level,
88+
node,
89+
prev,
90+
};
91+
prev = next;
92+
}
93+
});
94+
95+
return tree;
96+
}
97+
98+
console.log(makeTree(list));
99+
100+
/**
101+
* 思路
102+
*
103+
* 利用链表来向上回溯合适的父节点
104+
* 利用max变量记录当前分组的最大标题,如果比max还大,就需要新开一个分组了。
105+
*/

0 commit comments

Comments
 (0)