树形结构递归返回的结果labelId是id,pid是父id,pid是null是顶级菜单根据labelId查询并返回labelId,多个labelId用,隔开(递归子集的labelId也要返回)
时间: 2024-02-18 20:59:01 浏览: 49
好的,那么根据您的需求,可以编写一个递归函数,用于在树形结构中查找指定labelId的节点以及它的子节点,并返回这些节点的labelId。这个函数可以接受两个参数,分别是当前节点和要查找的labelId列表。具体实现可以参考以下代码:
```
function findNodesByLabelId(node, labelIds) {
let result = [];
if (labelIds.includes(node.id)) {
result.push(node.id);
}
if (node.children) {
for (let child of node.children) {
result = result.concat(findNodesByLabelId(child, labelIds));
}
}
return result;
}
function getLabelIdsByParentId(nodes, parentId) {
let labelIds = [];
for (let node of nodes) {
if (node.pid === parentId) {
labelIds.push(node.id);
labelIds = labelIds.concat(getLabelIdsByParentId(nodes, node.id));
}
}
return labelIds;
}
// 示例数据
const nodes = [
{ id: 1, pid: null, children: [
{ id: 2, pid: 1, children: [
{ id: 3, pid: 2 },
{ id: 4, pid: 2 },
]},
{ id: 5, pid: 1, children: [
{ id: 6, pid: 5 },
{ id: 7, pid: 5 },
]},
]},
{ id: 8, pid: null, children: [
{ id: 9, pid: 8 },
{ id: 10, pid: 8 },
]}
]
// 查找顶级节点及其子节点的labelId
let labelIds = [];
for (let node of nodes) {
if (node.pid === null) {
labelIds.push(node.id);
labelIds = labelIds.concat(getLabelIdsByParentId(nodes, node.id));
}
}
let result = [];
for (let labelId of labelIds) {
result = result.concat(findNodesByLabelId(nodes[0], [labelId]));
}
console.log(result.join(', ')); // 输出:1, 2, 3, 4, 5, 6, 7
```
以上代码中,`findNodesByLabelId`函数用于查找指定节点及其子节点的labelId,并将结果存入数组中返回。`getLabelIdsByParentId`函数用于递归查找指定节点的子节点,并返回这些节点的labelId。最后,我们可以先通过`getLabelIdsByParentId`函数找到所有顶级节点及其子节点的labelId,然后再通过`findNodesByLabelId`函数查找这些节点及其子节点的labelId。
阅读全文