JavaScript中filter处理数组偶数索引元素相乘结果不符问题
问题原因与解决方案
核心问题:误用filter方法的作用
你写的代码里用了filter,但**filter的唯一作用是筛选数组元素,而非转换元素的值**。
filter的回调函数返回值会被当作布尔值处理:
- 如果返回值是「真值」(比如非0数字、非空字符串等),就把原数组的当前元素保留到结果数组里;
- 如果返回「假值」,就丢弃该元素。
你的代码里,当索引是偶数时返回a * arr[arr.length-1],比如第一个元素计算得2*5=10(是真值),所以filter会把原元素2保留下来,而不是把10放进结果数组。这就是为什么输出是[2,4]而非预期的[10,20]。
正确实现方式
如果你要先筛选偶数索引的元素,再将每个元素乘以数组最后一个值,可以分两步:先用filter筛选,再用map转换:
const evenLast = arr => { return arr.filter((_, idx) => !(idx & 1)) .map(num => num * arr[arr.length - 1]); }; console.log(evenLast([2, 3, 4, 5])) // 输出 [10,20]
或者用reduce一步完成筛选+转换,避免额外的数组遍历:
const evenLast = arr => { return arr.reduce((result, current, idx) => { if (!(idx & 1)) { result.push(current * arr[arr.length - 1]); } return result; }, []); };
内容的提问来源于stack exchange,提问作者Mousa Rahimi
相关产品推荐
相关产品推荐

