JavaScript使用filter筛选全正子数组仅返回首个匹配项问题求助
问题产生原因
- 核心问题是计数变量
num的重置时机错误:当处理到符合条件的子数组时,代码在if(el.length==num)分支直接返回,后续的num = 0重置逻辑完全没有执行,导致处理下一个子数组时num会在上一次的结果基础上累加,最终计数错误无法匹配条件。 - 次要问题是for循环边界错误:
i<=el.length会导致访问到数组下标以外的undefined值,属于逻辑漏洞。 - 额外注意:
filter的回调只需要返回布尔值即可,返回元素本身会被自动隐式转换为布尔值,虽然非空数组为true不影响结果,但写法不规范。
修复方案
方案1:基于原有逻辑修改
将计数变量num的声明移到filter回调内部,每次处理子数组时都重新初始化,避免跨轮次的数值污染,同时修正for循环边界:
const input = [[1, 10, -100], [2, 20, 200], [3, 30, 300]]; function positiveRowsOnly(array) { return array.filter(el=>{ // 每次处理新的子数组都重新初始化计数 let num = 0; // 修正循环边界为小于数组长度 for(let i=0;i<el.length;i++){ if(el[i]>0){ num++; } } // 直接返回布尔值作为filter的判断依据 return el.length === num; }) } console.log(positiveRowsOnly(input)); // 输出结果:[[2, 20, 200], [3, 30, 300]]
方案2:使用内置方法简化代码
可以直接用数组的every方法判断子数组所有元素是否满足大于0的条件,不需要手动计数,逻辑更简洁:
function positiveRowsOnly(array) { return array.filter(subArr => subArr.every(num => num > 0)) }
内容的提问来源于stack exchange,提问作者A.Baes
相关产品推荐
相关产品推荐

