JavaScript递归过滤全层级符合status条件的子节点代码问题排查
代码问题梳理
你的代码存在3个核心错误,导致递归逻辑完全无法生效,只能处理顶层节点:
- return语句位置错误:你把
return item;写在了子节点递归逻辑的前面,JavaScript执行到return语句后会直接退出当前回调,后面的递归代码永远不会运行。 Array.filter()使用不规范:filter的回调只需要返回布尔值标识当前项是否需要保留,直接返回item属于隐式类型转换的野路子写法,极易引发逻辑异常。- 处理顺序错误:你需要先递归处理当前节点的子节点,再判断当前节点是否符合筛选条件,否则父节点被提前过滤的情况下,子节点的递归逻辑根本不会触发。
修正后的代码示例
function getitemfalse(){ // 递归过滤所有层级节点的公共方法 const filterByStatus = (nodes, status) => { return nodes.filter(item => { // 先处理当前节点的子节点 if (item.children && item.children.length > 0) { item.children = filterByStatus(item.children, status); } // 再判断当前节点是否符合筛选条件 return item.status === status; }) } $this.items = filterByStatus($this.users, false); }
如果你需要保留存在符合条件子节点的父节点(哪怕父节点本身不符合条件),只需要修改return的判断条件即可:
return item.status === status || (item.children && item.children.length > 0);
内容的提问来源于stack exchange,提问作者Jonh wick
相关产品推荐
相关产品推荐

