如何将数组中splice移除的元素push到另一数组并返回该数组?
解决数组元素移除并推入目标数组的问题
嘿,我明白你遇到的麻烦了!你想用splice移除原数组里的0,同时把这些0放到a数组里,但push没成功对吧?大概率是两个问题:一是循环遍历的时候索引没处理好,二是没正确利用splice的返回值。
先说说你可能踩的坑
很多人第一次用splice结合循环时会犯这个错:比如写了正向的for循环,当splice移除元素后,原数组的长度会变短,后面的元素会往前挪一位,这时候递增i就会跳过下一个元素;而且如果你是直接push(original[i]),这时候original[i]已经不是你要移除的0了(因为元素已经被移走,当前位置是下一个元素),自然push的内容不对。
举个错误示例:
const original = [1, 0, 2, 0, 3]; const a = []; // 错误的写法:索引会跳过元素,push的值也不对 for (let i = 0; i < original.length; i++) { if (original[i] === 0) { original.splice(i, 1); a.push(original[i]); // 这里push的是undefined或者下一个元素,不是0! } }
正确的解决方法
方法1:利用splice的返回值 + 正确处理索引
splice方法执行后,会返回一个包含被移除元素的数组,这正是我们需要的!同时用while循环控制索引,只有当没移除元素的时候才递增索引:
const original = [1, 0, 2, 0, 3]; const a = []; let i = 0; while (i < original.length) { if (original[i] === 0) { // splice返回被移除的元素数组,直接把它的内容push到a里 const removedItems = original.splice(i, 1); a.push(...removedItems); // 或者用a.push(removedItems[0]),效果一样 } else { // 只有当前元素不是0的时候,才移动索引 i++; } } console.log(a); // 输出 [0, 0],正是你要的结果 console.log(original); // 输出 [1, 2, 3],原数组已经移除了所有0
方法2:更简洁的方式(如果允许重新赋值原数组)
如果你不需要原地修改原数组(或者可以重新赋值),用filter会更简单,代码更易读:
let original = [1, 0, 2, 0, 3]; // 筛选出所有0放到a数组 const a = original.filter(item => item === 0); // 原数组保留非0元素 original = original.filter(item => item !== 0);
这种方式不需要处理循环索引,代码更简洁,不过要注意如果原数组是用const声明的,不能重新赋值,这时候还是用方法1更合适。
总结一下
核心就是两点:
- 利用
splice的返回值拿到被移除的元素,而不是去原数组里取 - 循环时注意索引的变化,避免跳过元素(用while循环或者反向for循环也可以)
内容的提问来源于stack exchange,提问作者Олег Войтинський
相关产品推荐
相关产品推荐

