我的JavaScript removeFromArray函数为何无法通过多值删除测试?
问题分析:removeFromArray多值删除失败原因及修复
你写的removeFromArray函数单值删除测试通过,但多值删除失败,核心问题确实在if语句的判断逻辑上。
你的代码
const removeFromArray = function(array,...toDelete) { const newArray=[]; array.forEach(item=>{ if(item != toDelete){ newArray.push(item); } }) return newArray; }; // Do not edit below this line module.exports = removeFromArray;
测试用例
describe('removeFromArray', () => { test('removes a single value', () => { expect(removeFromArray([1, 2, 3, 4], 3)).toEqual([1, 2, 4]); }); test('removes multiple values', () => { expect(removeFromArray([1, 2, 3, 4], 3, 2)).toEqual([1, 4]); }); });
问题原因
你用了...toDelete剩余参数语法,它会把传入的所有要删除的值打包成一个数组,而不是单个值。当前的item != toDelete是拿数组元素和整个toDelete数组做比较,这完全不符合逻辑:
- 单值测试时,
toDelete是[3],item != [3]因为类型不匹配(数字 vs 数组),碰巧让你通过了测试,但逻辑本身是错误的。 - 多值测试时,
toDelete是[3,2],任何item和这个数组比较都不会相等,所以所有元素都会被保留,自然无法通过测试。
修复方法
把判断逻辑改成检查当前item是否存在于toDelete数组中,用Array.includes()方法就能轻松实现:
修复后的forEach版本
const removeFromArray = function(array,...toDelete) { const newArray=[]; array.forEach(item=>{ if(!toDelete.includes(item)){ newArray.push(item); } }) return newArray; };
更简洁的filter版本
const removeFromArray = function(array,...toDelete) { return array.filter(item => !toDelete.includes(item)); };
说明
toDelete.includes(item)会判断toDelete数组里是否包含当前item,返回布尔值。加上!表示:当item不在要删除的列表里时,就把它加入结果数组(或保留在filter的结果中)。
内容的提问来源于stack exchange,提问作者buckwheat
相关产品推荐
相关产品推荐

