如何对对象数组中相同键对应的值进行求和?
解决相同键值求和的数组转换问题
嘿,我来帮你搞定这个需求!你要把数组里相同键的所有值求和,然后转换成目标格式,其实用JavaScript的reduce方法就能很优雅地解决,当然用forEach也能实现,我给你详细说说两种方式:
方法一:使用reduce(推荐,更简洁高效)
reduce天生就是用来处理这种累加场景的,我们可以先把所有相同键的值累加到一个临时对象里,再把这个对象转换成你要的数组格式:
const originalArray = [ {1: 22}, {1: 56}, {2: 345}, {3: 23}, {2: 12} ]; // 第一步:累加相同键的值到临时对象 const sumMap = originalArray.reduce((accumulator, currentItem) => { // 获取当前对象的唯一键(因为每个子对象只有一个键) const key = Object.keys(currentItem)[0]; const value = currentItem[key]; // 累加值:如果键已存在就加当前值,否则初始化为当前值 accumulator[key] = (accumulator[key] || 0) + value; return accumulator; }, {}); // 初始累加器是一个空对象 // 第二步:把临时对象转换成目标数组格式 const resultArray = Object.entries(sumMap).map(([key, value]) => ({ [key]: value // 用方括号实现动态键名 })); console.log(resultArray); // 输出: [{1: 78}, {2: 357}, {3: 23}]
方法二:使用forEach(符合你之前尝试的思路)
如果你更习惯用forEach,逻辑其实和上面一致,只是用循环来手动累加:
const originalArray = [ {1: 22}, {1: 56}, {2: 345}, {3: 23}, {2: 12} ]; const sumMap = {}; // 遍历数组,累加相同键的值 originalArray.forEach(item => { const key = Object.keys(item)[0]; const value = item[key]; sumMap[key] = (sumMap[key] || 0) + value; }); // 转换为目标数组 const resultArray = Object.entries(sumMap).map(([k, v]) => ({[k]: v})); console.log(resultArray); // 同样得到目标结果
关键说明
- 因为你的每个子对象都只有一个键值对,所以用
Object.keys(item)[0]可以快速拿到对应的键;如果子对象可能有多个键,只需要调整遍历键的逻辑即可。 (sumMap[key] || 0)是为了处理第一次遇到某个键的情况,确保初始值是0,避免出现NaN。Object.entries会把对象转换成[键, 值]的数组,再用map把每一组转成单个对象,就得到你要的格式了。
内容的提问来源于stack exchange,提问作者Parth Patel
相关产品推荐
相关产品推荐

