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
相关产品推荐
相关产品推荐

