如何判断节点树对象的path属性是否含指定url?递归问题排查
递归检查节点树中URL存在性的修正方案
问题根源
你的递归函数之所以会跳过父节点之后的节点,大概率是只处理了当前层级的第一个节点,没有遍历完同层级的所有兄弟节点,或者在处理子节点后直接返回,没有继续检查后续节点。
修正后的递归实现
以JavaScript为例,正确的递归逻辑应该遍历当前层级的每一个节点,同时递归检查子节点,只有在找到匹配时才提前返回,否则遍历完所有节点后返回false:
function isValid(nodes, targetUrl) { // 遍历当前层级的所有节点 for (const node of nodes) { // 检查当前节点的path是否匹配目标URL if (node.path === targetUrl) { return true; } // 如果当前节点有子节点,递归检查子节点树 // 只有子节点递归返回true(找到匹配)时,才向上返回true if (node.children && isValid(node.children, targetUrl)) { return true; } } // 所有节点(含所有层级子节点)都检查完毕,未找到匹配 return false; }
关键修正点
- 必须遍历当前层级的每一个节点,不能只处理第一个节点就终止当前层级的遍历
- 递归检查子节点时,仅当子节点递归返回
true时才提前返回,否则继续遍历当前层级的下一个节点 - 确保只有在所有节点(包括所有嵌套子节点)都检查完成且无匹配时,才返回
false
错误写法对比(你的原函数可能存在的问题)
比如下面这种错误写法,只会处理当前层级的第一个节点,完全跳过后续兄弟节点,导致添加子节点后,父节点之后的节点永远不会被检查:
// 错误示例:仅处理第一个节点,未遍历同层级其他节点 function isValid(nodes, targetUrl) { if (!nodes?.length) return false; const firstNode = nodes[0]; if (firstNode.path === targetUrl) return true; // 递归子节点后直接返回,没处理nodes[1]及之后的节点 return firstNode.children ? isValid(firstNode.children, targetUrl) : false; }
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

