如何用JavaScript从指定对象数组生成分组统计后的新数组?
按num属性分组并统计count和totalSum的解决方案
没问题,这是个很常见的数组分组统计需求,我给你提供两种实用的JavaScript实现方式:
方法一:使用Array.reduce()(推荐,简洁高效)
这是处理这类场景最常用的方案,用reduce一步完成分组和统计,再转换成你需要的数组格式:
// 你的输入数组 const inputArr = [ {num: 1, sum: 10}, {num: 1, sum: 2}, {num: 1, sum: 3}, {num: 2, sum: 1}, {num: 2, sum: 40}, {num: 2, sum: 100}, {num: 3, sum: 0}, {num: 4, sum: 0}, ]; // 第一步:用reduce完成分组统计 const groupedStats = inputArr.reduce((accumulator, currentItem) => { // 如果当前num还没被记录,初始化统计对象 if (!accumulator[currentItem.num]) { accumulator[currentItem.num] = { count: 0, totalSum: 0 }; } // 更新计数和总和 accumulator[currentItem.num].count++; accumulator[currentItem.num].totalSum += currentItem.sum; return accumulator; }, {}); // 初始值是空对象,用来存储分组数据 // 第二步:转换成你需要的数组格式 const finalResult = Object.entries(groupedStats).map(([num, stats]) => { // 用Number(num)把键转成数字类型,否则默认是字符串 return { [Number(num)]: stats }; }); console.log(finalResult);
运行后会得到符合预期的结果:
[ { 1: { count: 3, totalSum: 15 } }, { 2: { count: 3, totalSum: 141 } }, { 3: { count: 1, totalSum: 0 } }, { 4: { count: 1, totalSum: 0 } } ]
方法二:使用for...of循环(更直观,适合新手)
如果你对reduce不太熟悉,用普通循环也能实现,逻辑更直白:
const inputArr = [ {num: 1, sum: 10}, {num: 1, sum: 2}, {num: 1, sum: 3}, {num: 2, sum: 1}, {num: 2, sum: 40}, {num: 2, sum: 100}, {num: 3, sum: 0}, {num: 4, sum: 0}, ]; const groupedStats = {}; // 遍历数组,逐个统计 for (const item of inputArr) { const num = item.num; if (!groupedStats[num]) { groupedStats[num] = { count: 0, totalSum: 0 }; } groupedStats[num].count++; groupedStats[num].totalSum += item.sum; } // 转换成目标数组格式 const finalResult = Object.entries(groupedStats).map(([num, stats]) => ({ [Number(num)]: stats })); console.log(finalResult);
补充说明
- 如果你不需要把键转成数字类型,直接用
[num]即可,结果里的键会是字符串类型(比如'1'),这在JavaScript里不影响使用。 - 两种方法的核心逻辑都是先按
num分组存储统计数据,再把分组对象转换成你需要的数组结构。
内容的提问来源于stack exchange,提问作者Fazil Amir
相关产品推荐
相关产品推荐

