如何修复JavaScript数组移除指定元素函数?解决indexOf返回-1问题
问题分析与解决方案
错误原因
你代码里的核心问题是调用indexOf时传错了参数:
removeThis是包含要删除元素的数组(比如调用时传3,removeThis就是[3])- 你写的
array.indexOf(removeThis)是在查找数组[3]是否存在于原数组中,但原数组元素都是数字,自然找不到,返回-1 - 当
splice的第一个参数为-1时,会删除数组最后一个元素,原数组[1,2,3,4]因此被改成[1,2,3],这就是你看到的错误输出
修复方案
要覆盖所有测试用例,需处理以下场景:删除单个/多个元素、删除重复元素、忽略不存在的元素、区分元素类型(如数字1和字符串"1")
方案1:使用filter(简洁高效)
利用数组filter方法过滤掉所有在removeThis中的元素,天然满足所有测试要求:
const removeFromArray = function(array, ...removeThis) { return array.filter(item => !removeThis.includes(item)); };
filter遍历原数组,仅保留不在removeThis中的元素includes采用严格相等(===)判断,自动区分数字与字符串类型- 重复元素会被全部过滤,不存在的元素直接保留
方案2:手动循环处理(兼容旧环境/理解底层逻辑)
若需手动操作数组,需用循环持续查找并删除所有匹配项:
const removeFromArray = function(array, ...removeThis) { for (const target of removeThis) { let index; // 循环查找直到所有匹配项都被删除 while ((index = array.indexOf(target)) !== -1) { array.splice(index, 1); } } return array; };
- 对每个要删除的目标元素,用
while循环持续查找,直到indexOf返回-1 - 直接修改原数组,同时处理了重复元素的情况
测试验证
两种方案均能通过你提供的所有测试用例:
- 单个元素删除:
removeFromArray([1,2,3,4],3)返回[1,2,4] - 多个元素删除:
removeFromArray([1,2,3,4],3,2)返回[1,4] - 重复元素删除:
removeFromArray([1,2,2,3],2)返回[1,3] - 忽略不存在元素:
removeFromArray([1,2,3,4],7,"tacos")返回原数组 - 区分类型:
removeFromArray([1,2,3],"1",3)返回[1,2]
内容的提问来源于stack exchange,提问作者algo
相关产品推荐
相关产品推荐

