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

求从数组中移除所有零并移至末尾的更简洁JavaScript实现方案

如何更简便地实现将数组中的所有零移至末尾?

我遇到一道JavaScript练习题,要求把数组里的所有零移到数组末尾,同时保留其他元素的相对顺序。我自己写了一段实现代码,但感觉不够简洁,想问问有没有更简便的写法?

我的实现代码:

let arr = [2, 0, 5, 12, 55, 0, 8, 0, 10, 11];
let countItem = 0;

for (let i = 0; i < arr.length; i++) {
  if (arr[i] === 0) {
    countItem++;
  }
  if (arr[i] === 0) {
    arr.splice(i, 1);
  }
}

for(j=0; j<countItem;j++){
    arr.push(0)
}

console.log(arr);

方法1:使用filter + concat

这是最直观简洁的写法,用filter筛选出所有非零元素,再拼接对应数量的零即可:

const arr = [2, 0, 5, 12, 55, 0, 8, 0, 10, 11];
const nonZeros = arr.filter(num => num !== 0);
const result = nonZeros.concat(Array(arr.length - nonZeros.length).fill(0));
console.log(result); // [2, 5, 12, 55, 8, 10, 11, 0, 0, 0]

优点是代码可读性极强,核心逻辑清晰,不需要手动操作数组索引。

方法2:使用sort自定义排序规则

利用数组的sort方法,自定义排序逻辑让零自动排到最后:

const arr = [2, 0, 5, 12, 55, 0, 8, 0, 10, 11];
arr.sort((a, b) => {
  if (a === 0) return 1;    // 把当前零元素往后排
  if (b === 0) return -1;   // 把对比的零元素往后排,当前非零元素往前
  return 0;                 // 非零元素保持原有相对顺序
});
console.log(arr); // [2, 5, 12, 55, 8, 10, 11, 0, 0, 0]

注意:此方法会直接修改原数组,若需保留原数组,记得先做拷贝(比如[...arr].sort(...))。

方法3:一次遍历原地修改

如果追求原地修改且更高性能,可以用一次遍历完成,避免splice带来的数组元素移动损耗:

let arr = [2, 0, 5, 12, 55, 0, 8, 0, 10, 11];
let nonZeroIndex = 0;

// 把所有非零元素移到数组前端
for (let i = 0; i < arr.length; i++) {
  if (arr[i] !== 0) {
    arr[nonZeroIndex] = arr[i];
    nonZeroIndex++;
  }
}

// 将数组剩余位置填充为零
for (let i = nonZeroIndex; i < arr.length; i++) {
  arr[i] = 0;
}

console.log(arr); // [2, 5, 12, 55, 8, 10, 11, 0, 0, 0]

这种方法时间复杂度为O(n),比你原代码中用splice的O(n²)效率更高。

内容的提问来源于stack exchange,提问作者anyname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:55:23