【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);},