为何将array.length作为Array.splice第二个参数时无法正常工作?
移除数组指定元素的代码失效原因分析
你写的代码没法实现需求,核心问题出在这几点:
1. 条件判断完全错误
你在if(number == array[i])里把整个rest参数数组和数组的单个元素做比较了。...number本身就是数组(比如调用时传入1、2,number就是[1,2]),JS里数组属于对象,对象比较的是引用地址而非内容,所以这个条件永远不成立,splice根本没执行,原数组当然没变化。
正确的判断应该是检查当前元素是否在目标数组里,比如用number.includes(array[i])。
2. splice参数用法逻辑错误
就算条件判断对了,array.splice(i, numArray.length)也不对。splice的第二个参数是要删除的元素数量,你传numArray.length(这里是2),意思是从索引i开始删2个元素,但你要的是删除所有匹配的元素,不是固定删2个,而且这么删会直接打乱后续元素的索引,循环逻辑也会出错。
3. 多余的数组转换操作
...number作为rest参数,本身就是数组,完全没必要用Array.from(number)再转一次,纯粹多此一举。
另外补充:就算修复了条件判断,你的正向循环逻辑也有问题——用splice修改原数组后,数组长度缩短,后续元素会前移,i++会跳过部分元素。比如删除索引0的元素后,原索引1的元素移到0位,但i已经变成1,就会漏掉这个元素。可以改成从后往前循环避免这个问题。
比如修正后的简易版本(仅针对错误点调整,非最优解):
const removeFromArray = function(array, ...numbers) { // 从后往前循环,避免索引错乱 for(let i = array.length - 1; i >= 0; i-- ){ if(numbers.includes(array[i])){ array.splice(i, 1); // 每次只删除当前匹配的单个元素 } } return array; };
内容的提问来源于stack exchange,提问作者Huda Abdullah
相关产品推荐
相关产品推荐

