You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组中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,提问作者Олег Войтинський

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:20:35