如何不使用循环递归查找树形嵌套数组?实现双向搜索
树形结构无循环递归查找实现
要实现树形结构的全维度(水平+垂直)查找,只需在你现有水平递归的基础上,增加对当前节点子节点的递归检查即可。核心逻辑是:
- 先判断当前头部节点是否匹配目标值,匹配则直接返回
- 若不匹配,优先递归查找当前头部节点的子节点(垂直维度)
- 子节点无匹配结果时,再递归处理剩余的兄弟节点(水平维度)
具体实现代码如下:
function findInTree(targetName, nodes) { // 递归终止条件:节点数组为空,返回null if (!nodes.length) return null; const [head, ...tail] = nodes; // 1. 检查当前节点是否匹配目标 if (head.name === targetName) { return head; } // 2. 递归查找当前节点的子节点(垂直维度) const foundInChildren = head.children ? findInTree(targetName, head.children) : null; if (foundInChildren) { return foundInChildren; } // 3. 递归查找剩余的兄弟节点(水平维度) return findInTree(targetName, tail); }
逻辑说明
- 终止条件:当传入的节点数组为空时,说明当前分支无匹配项,返回
null - 节点匹配检查:先确认当前头部节点是否为目标节点,是则直接返回该节点
- 垂直维度遍历:如果当前节点存在子节点,递归遍历其子节点数组,找到匹配项立即返回
- 水平维度遍历:当前节点及其子节点都无匹配时,继续递归处理剩余的兄弟节点数组
使用示例
调用方式和你之前的水平查找逻辑一致:
// 查找目标节点 const targetNode = findInTree('child 1.1.1', children); console.log(targetNode); // 输出匹配的节点对象 { name: 'child 1.1.1', children: [...] }
内容的提问来源于stack exchange,提问作者Thore
相关产品推荐
相关产品推荐

