JavaScript嵌套filter调用外层返回原数组而非空数组原因咨询
问题原因
Array.prototype.filter 不会严格要求回调函数返回布尔类型值,它会将回调的返回值做隐式布尔类型转换,转换结果为真(truthy)就保留当前遍历元素,为假(falsy)就剔除元素。
JavaScript 中属于假值(falsy)的值只有固定8种:
- 布尔值
false - 数值
0、-0、0n(BigInt类型的0) - 空字符串
""、''、`` nullundefinedNaN
所有不在上述列表里的值,做布尔转换时结果都是
true,这其中就包括空数组[]、空对象{}——哪怕内部没有任何元素/属性,它们作为对象类型,永远是真值。
对应你的代码逻辑:
你写的内层filter回调没有任何返回逻辑,每次遍历都返回undefined(属于falsy值),所以内层filter确实永远返回空数组[]。但这个空数组作为外层filter回调的返回值,被隐式转换为true,相当于告诉外层filter「当前元素符合保留条件」,最终外层就保留了所有原数组元素。
验证方法
你可以直接在控制台执行下面的代码验证布尔转换结果:
console.log(Boolean([])) // 输出 true console.log(Boolean([].length)) // 输出 false,因为空数组长度为0,0是falsy值
修正方式
如果你希望内层返回空数组时,外层filter剔除对应元素,需要显式返回一个falsy值作为判断依据,最常见的写法是判断内层返回数组的长度:
var data = [1, 2, 3, 5, 2, 1, 4]; var res = data.filter(function (v) { // 替换为你实际需要的内层过滤逻辑 var matchItems = data.filter(function (v1) { return v1 === v; }); // 只有匹配到元素(长度大于0)时才保留当前遍历项 return matchItems.length > 0; }); console.log(res);
内容的提问来源于stack exchange,提问作者Lee JianXing
相关产品推荐
相关产品推荐

