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

