如何按连续等值元素过滤数组并生成带计数的分组结果?
实现连续等值数组元素分组统计的方法
刚好做过类似的需求,给你分享两种靠谱的实现方法,都是JavaScript里常用的思路👇
方法一:使用reduce方法(简洁高效)
reduce是处理数组聚合类需求的利器,这里我们可以用它来逐个迭代元素,动态维护结果数组:
let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps']; let filterArray = array.reduce((acc, current) => { // 取出结果数组的最后一组元素 const lastGroup = acc[acc.length - 1]; // 如果最后一组存在,且元素和当前元素相同,就把计数加1 if (lastGroup && lastGroup[0] === current) { lastGroup[1]++; } else { // 否则就新增一组,初始计数为1 acc.push([current, 1]); } return acc; }, []); console.log(filterArray); // 输出:[['yay', 3], ['opps', 1], ['yay', 2], ['opps', 3]]
逻辑很清晰:初始化一个空数组作为累加器,每遍历一个元素就检查结果数组的最后一组是不是同一个值,是的话就增加计数,不同就新建一组。
方法二:使用普通for循环(直观易懂)
如果你更习惯用基础循环,这种写法逻辑直白,新手也能快速看懂:
let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps']; let filterArray = []; let currentCount = 1; for (let i = 0; i < array.length; i++) { // 只要当前元素和下一个元素相同,就累加计数 if (i < array.length - 1 && array[i] === array[i + 1]) { currentCount++; } else { // 遇到不同元素或者数组末尾,就把当前元素和计数存入结果 filterArray.push([array[i], currentCount]); currentCount = 1; // 重置计数,准备统计下一组 } } console.log(filterArray); // 同样得到目标结果
这种方法就是通过遍历数组,逐个比较当前元素和下一个元素,连续相同就累加,直到遇到不同元素时把统计结果存入数组,再重置计数。
两种方法都能完美实现你的需求,选哪种全看个人习惯~
内容的提问来源于stack exchange,提问作者Valera Checha
相关产品推荐
相关产品推荐

