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

如何将对象数组转换为连续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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:45:38