返回地区勾选之后的数组

本文最后更新于:2024年11月17日 晚上

tag: 递归

题目需求, 传入一个 可以勾选的tree,第二个参数是之前勾选的treeData,第三个参数是勾选掉的节点,返回一个更新后的treeData

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
const treeData = [
{
name: "浙江省",
children: [
{
name: "杭州市",
children: [
{
name: "西湖区",
children: [{ name: "文三路" }],
},
{ name: "上城区" },
],
},
{ name: "宁波市" },
],
},
{
name: "江苏省",
children: [{ name: "南京市" }, { name: "苏州市" }],
},
];


const selectedPath = [
"浙江省",
"杭州市",
"上城区",
"西湖区",
"文三路",
"江苏省",
"南京市",
];
const deselectedNode = "西湖区";

console.log(updateTreeData(treeData, selectedPath, deselectedNode)); //[ '浙江省', '杭州市', '上城区', '江苏省', '南京市' ]

题解:

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
function updateTreeData(treeData, selectedPath, deselectedNode) {
const updatedPath = []; // 存储更新后的路径

// 递归函数,用于遍历树
function traverse(node, path) {
if (node.name === deselectedNode) {
return;
}

if (selectedPath.includes(node.name)) {
path.push(node.name);
}

if (node.children && node.children.length > 0) {
node.children.forEach((child) => traverse(child, path));
}

return false;
}

// 遍历每个根节点
treeData.forEach((node) => traverse(node, updatedPath));

return updatedPath;
}

思路:

树的题目一般都是遍历,当查询到当前节点的时候,判断是否是取消勾选的节点,如果是就跳出,否则判断该节点是否选中的节点,是就放入结果数组中,同时判断是否有子节点,有的话就递归调用,没有就结束