求从数组中移除所有零并移至末尾的更简洁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
相关产品推荐
相关产品推荐

