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

JS如何简洁实现移除每5个元素为一组的数组中第3、4个元素

数组按组移除指定位置元素的优化方案

需求说明

输入数组长度固定为5的倍数,以每连续5个元素为一组,移除每组中第3、第4个元素(从1开始计数,对应数组索引2、3),最终仅保留每组第1、2、5个元素,输出长度为原数组3/5的结果数组。
原实现通过两次循环搭配splice原地修改数组完成需求,代码如下:

const arr = ["good","good","bad","bad","good","good","good","bad","bad","good",];

// remove every 3rd of 5 elements
for (let i = 2; i <= arr.length; i += 4) {
  arr.splice(i, 1);
}

// remove every 3rd of 4 elements
for (let i = 2; i <= arr.length; i += 3) {
  arr.splice(i, 1);
}

console.log(arr)
// expected output ["good","good","good","good","good","good"]

优化方案

原写法存在两个明显不足:splice每次执行都会触发数组后续元素的位移,两次循环的步长需要结合第一次删除后的数组长度推导,代码可读性差,后续维护的人很难快速看懂删除逻辑。
最简洁的实现不需要原地修改数组,直接用filter按索引规则过滤生成新数组即可,逻辑完全和需求对齐,没有多余的计算:

const arr = ["good","good","bad","bad","good","good","good","bad","bad","good"];

// 每5个元素为一组,索引对5取模结果为0、1、4的元素就是需要保留的第1、2、5位元素
const res = arr.filter((_, idx) => {
  const posInGroup = idx % 5;
  return posInGroup === 0 || posInGroup === 1 || posInGroup === 4;
});

console.log(res); 
// 输出: ["good","good","good","good","good","good"]

这个方案的优势:

  • 逻辑直白,判断条件和需求规则一一对应,不需要反推循环步长,维护成本低
  • 没有原地修改原数组,避免了splice带来的反复元素位移开销,大数组场景下性能更好
  • 代码结构简单,仅需一次遍历就可以得到结果

如果业务场景强制要求原地修改原数组,也可以选择从数组尾部倒序遍历,每遇到一组里的索引3、2位置就执行删除,避免删除元素导致的索引偏移问题,但可读性和性能都不如过滤生成新数组的方案。

内容的提问来源于stack exchange,提问作者Joshua Pelton-Stroud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:06:25