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

ES6中如何将JS数组以重复元素为分隔符拆分为对应数组块?

ES6实现数组按重复元素拆分方案

适配示例场景的最简实现(相邻重复元素拆分)

你的示例中拆分点刚好在相邻重复元素的中间,重复元素分别归属前后两个子数组,可用以下代码直接实现:

const initialArray = ['A','B','C','C','D','E','F','F','G','K'];
const chunks = [];
// 初始化当前子数组,放入第一个元素
let currentChunk = [initialArray[0]];

for (let i = 1; i < initialArray.length; i++) {
  const currentItem = initialArray[i];
  const prevItem = initialArray[i-1];
  // 碰到相邻重复元素时触发拆分
  if (currentItem === prevItem) {
    chunks.push(currentChunk);
    currentChunk = [];
  }
  currentChunk.push(currentItem);
}
// 推入最后一段剩余的子数组
chunks.push(currentChunk);

console.log(chunks); // 输出:[['A','B','C'], ['C','D','E','F'], ['F','G','K']]

通用实现(所有重复元素作为分隔符,无论是否相邻)

如果你的规则是整个数组中出现次数≥2的元素都作为分隔符,不需要相邻也可触发拆分,用以下实现:

const initialArray = ['A','B','C','D','C','E','F','G','F','K'];
// 第一步:统计所有元素出现次数,标记出重复元素
const countMap = initialArray.reduce((map, item) => {
  map.set(item, (map.get(item) || 0) + 1);
  return map;
}, new Map());

const chunks = [];
let currentChunk = [];
// 记录已经作为拆分边界使用过的元素,避免重复拆分
const usedDelimiter = new Set();

initialArray.forEach(item => {
  currentChunk.push(item);
  // 满足三个条件时拆分:是重复元素、还未用作拆分边界、不是当前子数组的第一个元素
  if (countMap.get(item) > 1 && !usedDelimiter.has(item) && currentChunk.length > 1) {
    chunks.push(currentChunk);
    currentChunk = [item];
    usedDelimiter.add(item);
  }
});
chunks.push(currentChunk);

// 输出:[['A','B','C'], ['C','D','E','F'], ['F','G','K']]

逻辑说明

  • 相邻拆分实现仅判断当前元素与前一个元素是否相等,触发拆分时将当前子数组存入结果,新子数组从当前重复元素开始拼接
  • 通用实现先用Map统计元素出现频率,标记出所有重复元素,碰到重复元素时触发拆分,同时记录已使用的分隔符避免误拆分
  • 两种实现都默认处理基础类型元素,如需适配引用类型,可调整相等判断逻辑改为匹配元素唯一标识即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:01