【JS】检索树结构,并返回结果节点的路径与子节点
- 需求
- 代码
- 效果展示
需求
一个树结构,需要添加条件检索功能,检索结果依然是一个树结构,包含所有的符合要求的节点,以及他们到根节点的路径,与他们的子节点
代码
searchTree(departments, queryParams) {
// 用于克隆具有匹配子项的节点的辅助函数
const cloneWithChildren = (node) => {
return {
...node,
children: node?.children?.map(cloneWithChildren) || [], // 克隆所有的子节点
};
};
// 核心递归搜索功能
function searchNode(node, queryParams) {
let judge = () => {
let name = queryParams.deptName ? node.deptName.includes(queryParams.deptName) : true;
let status = ['0', '1'].includes(queryParams.status + '')
? queryParams.status + '' === node.status + ''
: true;
return name && status;
//这里是我个人的搜索条件,一个名称的模糊查询与状态值匹配。
};
if (judge()) {
// 如果当前节点包含关键词,克隆整个节点连同其子节点
return cloneWithChildren(node);
}
if (node.children) {
const matchingChildren = node.children
.map((child) => searchNode(child, queryParams))
.filter((child) => child !== null);
if (matchingChildren.length > 0) {
// 如果任何子节点包含匹配项,则克隆父节点并连接匹配的子节点
return { ...node, deptName: node.deptName, children: matchingChildren };
}
}
// 如果当前节点和子节点都不包含关键词,则不包含它在内
return null;
}
// 递归遍历部门列表并构建结果树
return departments.map((dept) => searchNode(dept, queryParams)).filter((dept) => dept !== null);
},