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

JavaScript中如何按首项分组二维数组并计算各组第二项的平均值

实现数组按首项分组求平均值的方案

现有代码的问题

  • 循环遍历每个元素时都调用一次filter,相同首项的元素会触发多次完全重复的过滤操作,存在不必要的性能损耗
  • 仅完成了分组筛选的逻辑,没有对筛选后的数组做求和、平均值计算的处理
  • 最终输出会出现重复的分组结果,比如首项为12-9的分组会被打印3次

推荐实现方案

使用reduce先做分组统计,再计算平均值,代码更简洁高效:

// 第一步:按首项分组,统计每组的总和与元素数量
const groupStats = data.reduce((acc, item) => {
  const key = item[0]
  const value = item[1]
  // 若当前key不存在,初始化统计项
  if (!acc[key]) {
    acc[key] = { sum: 0, count: 0 }
  }
  acc[key].sum += value
  acc[key].count += 1
  return acc
}, {})

// 第二步:遍历统计结果,计算平均值
const result = Object.entries(groupStats).map(([key, stats]) => {
  // 保留1位小数,和示例输出格式匹配
  const average = (stats.sum / stats.count).toFixed(1)
  return {
    group: key,
    average: Number(average)
  }
})

console.log(result)

输出结果

[
  { group: '12-9', average: 124.7 },
  { group: '1-8', average: 134 },
  { group: '21-5', average: 131.2 }
]

原有代码修改版

如果要基于你现有的循环逻辑调整,可以参考以下实现:

// 存储已处理的key,避免重复计算
const processedKeys = new Set()
const result = []
for (let item of data) {
  const temp = item[0]
  // 已处理过的分组直接跳过
  if (processedKeys.has(temp)) continue
  const myValues = data.filter(value => value[0] === temp)
  // 对分组内的数值求和
  const sum = myValues.reduce((total, val) => total + val[1], 0)
  // 计算平均值,保留1位小数
  const average = (sum / myValues.length).toFixed(1)
  result.push({ group: temp, average: Number(average) })
  // 标记分组为已处理
  processedKeys.add(temp)
}
console.log(result)

内容的提问来源于stack exchange,提问作者Ludwig Loth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:45:01