JavaScript中按属性分组聚合对象数组并保留结构的实现
按指定属性分组并求和聚合的实现方案
可以用JavaScript原生的reduce方法实现类似Python中groupby+agg的效果,无需依赖第三方库,且能兼容单条数据对应分组的场景,具体实现如下:
实现代码
const teams = [{posteam: 'ARI', week: 1, touchdowns: 2, fieldgoals: 3}, {posteam: 'ARI', week: 2, touchdowns: 4, fieldgoals: 1}, {posteam: 'ARI', week: 3, touchdowns: 1, fieldgoals: 4},{posteam: 'ATL', week: 1, touchdowns: 0, fieldgoals: 2}]; const aggregated = Object.values(teams.reduce((acc, curr) => { // 以posteam作为分组键 const key = curr.posteam; if (!acc[key]) { // 初始化分组对象,只保留需要的属性 acc[key] = { posteam: key, touchdowns: 0, fieldgoals: 0 }; } // 累加数值属性 acc[key].touchdowns += curr.touchdowns; acc[key].fieldgoals += curr.fieldgoals; return acc; }, {})); console.log(aggregated);
代码说明
reduce遍历处理:通过reduce构建一个临时对象,键为posteam的值,值为对应分组的聚合对象。- 初始化分组:如果当前分组不存在,就创建一个包含
posteam、初始化为0的touchdowns和fieldgoals的对象。 - 数值累加:对每个分组的数值属性进行累加操作。
- 转换为目标数组:用
Object.values()将临时对象的取值转换为数组,得到最终的聚合结果。
兼容性说明
当某个posteam只有单条数据时,代码会正常初始化分组并累加该条数据的数值,最终输出包含该分组的单个对象,完全符合需求。
内容的提问来源于stack exchange,提问作者jwald3
相关产品推荐
相关产品推荐

