如何按指定key对数组对象分组并对其余同名字段值累加求和
实现方案
最高效的实现是单次遍历同时完成分组和数值累加,时间复杂度为O(n),仅需遍历原数组一次,不需要先分组再二次遍历做求和计算。
代码实现
const data = [{ "month": "October", "active_users": 20, "invited_users": 35 }, { "month": "October", "active_users": 50, "invited_users": 60 }, { "month": "September", "active_users": 10, "invited_users": 45 }, { "month": "September", "active_users": 80, "invited_users": 95 }] function groupAndSum(objectArray, groupKey) { const resultObj = objectArray.reduce((acc, cur) => { const keyValue = cur[groupKey]; // 不存在该分组则初始化 if (!acc[keyValue]) { acc[keyValue] = { [groupKey]: keyValue }; // 初始化所有数值字段为0 Object.keys(cur).forEach(key => { if (key !== groupKey && typeof cur[key] === 'number') { acc[keyValue][key] = 0; } }); } // 累加数值字段 Object.keys(cur).forEach(key => { if (key !== groupKey && typeof cur[key] === 'number') { acc[keyValue][key] += cur[key]; } }); return acc; }, {}); // 转为数组格式返回 return Object.values(resultObj); } const result = groupAndSum(data, 'month'); console.log(result);
运行上述代码输出结果和你给出的预期完全一致。如果你的场景里需要明确指定要累加的字段,避免其他非数值字段被误处理,也可以调整函数增加一个可传入的累加字段列表参数,逻辑更可控。
内容的提问来源于stack exchange,提问作者Suraj Pawar
相关产品推荐
相关产品推荐

