如何将对象数组转换为连续result为2的分组计数数组?
统计连续
result为2的元素数量并生成数组 给定对象数组:
const arrayToCheck = [ { result: 2 }, { result: 2 }, { result: 0 }, { result: 2 }, { result: 0 }, { result: 2 }, { result: 2 }, { result: 2 }, { result: 0 }, { result: 2 }, { result: 2 }, { result: 2 }, { result: 2 }, { result: 0 }, { result: 2 } ];
需要转换为:
const expectedResult = [2, 1, 3, 4, 1];
核心需求:统计每组连续的result值为2的元素数量,将这些数量组成数组返回。
解决方案
直观遍历实现
这种写法逻辑清晰,易于理解和维护:
const countConsecutiveTwos = (arr) => { const result = []; let currentCount = 0; // 遍历数组每一项 for (const item of arr) { if (item.result === 2) { // 当前元素是2,递增计数 currentCount++; } else { // 遇到非2元素,且当前有有效计数时,存入结果并重置计数 if (currentCount > 0) { result.push(currentCount); currentCount = 0; } } } // 处理数组末尾可能剩余的连续2 if (currentCount > 0) { result.push(currentCount); } return result; }; // 测试验证 console.log(countConsecutiveTwos(arrayToCheck)); // 输出 [2, 1, 3, 4, 1]
简洁reduce实现
利用数组reduce方法完成统计,代码更紧凑:
const countConsecutiveTwos = (arr) => { // 用reduce维护结果数组和当前计数,最后合并处理末尾的计数 const { result, current } = arr.reduce((acc, item) => { if (item.result === 2) { acc.current++; } else { if (acc.current > 0) { acc.result.push(acc.current); acc.current = 0; } } return acc; }, { result: [], current: 0 }); // 补充末尾的连续2计数 return current > 0 ? [...result, current] : result; }; // 测试验证 console.log(countConsecutiveTwos(arrayToCheck)); // 输出 [2, 1, 3, 4, 1]
内容的提问来源于stack exchange,提问作者user3887366
相关产品推荐
相关产品推荐

