数组.filter()函数疑问:真值筛选正常,假值筛选返回空数组
问题分析与修复方案
核心问题
假值筛选函数返回空数组,主要有两个关键原因:
1. filter方法判定逻辑误解
Array.filter()只会保留返回值为true的元素。你的falsy_Check函数匹配到假值时,返回的是假值本身(比如''、0、null等),这些值会被filter判定为false,因此不会被加入结果数组。
2. NaN的比较错误
JavaScript中NaN === NaN永远返回false,所以falsy_Check里_rawData === NaN的条件永远无法触发,导致NaN无法被识别为假值。
另外还有冗余问题:-0 === 0结果为true,所以_rawData === -0的判断是多余的,和_rawData === 0重复。
修复后的代码
let array_rawData = ['red', '', 0, 42, 'blue', 42, -0, null, undefined, NaN, 'hike!', 0n]; // 注:原代码赋值是引用传递,若需真正复制数组可使用 [...array_rawData] let _rawArrayData_toBeTruthy = array_rawData; let _rawArrayData_toBeFalsy = array_rawData; function truthy_Check (_rawData) { // 直接返回布尔值,修正NaN判断逻辑 return _rawData !== '' && _rawData !== 0 && _rawData !== null && _rawData !== undefined && _rawData !== 0n && !Number.isNaN(_rawData); } function falsy_Check (_rawData) { // 返回布尔值,修正NaN判断,移除冗余的-0判断 return _rawData === '' || _rawData === 0 || _rawData === null || _rawData === undefined || _rawData === 0n || Number.isNaN(_rawData); } let array_filteredForTruthy = _rawArrayData_toBeTruthy.filter(truthy_Check); let array_filteredForFalsy = _rawArrayData_toBeFalsy.filter(falsy_Check); console.log(array_filteredForTruthy); // 输出: ['red', 42, 'blue', 42, 'hike!'] console.log(array_filteredForFalsy); // 输出: ['', 0, -0, null, undefined, NaN, 0n]
额外优化建议
如果想更简洁实现真假值筛选,可以利用JavaScript原生的布尔转换特性,无需手动逐个判断假值:
// 筛选所有真值 const truthyArray = array_rawData.filter(item => Boolean(item)); // 筛选所有假值 const falsyArray = array_rawData.filter(item => !Boolean(item));
内容的提问来源于stack exchange,提问作者Aerdellosi
相关产品推荐
相关产品推荐

