如何合并含同名对象的二维列表并累加对应值生成新列表?
合并数组中同名对象的方法
假设你有如下结构的数组(以JavaScript为例):
const mergedArray = [ { name: 'bananas', quantity: 2 }, { name: 'apples', quantity: 3 }, { name: 'bananas', quantity: 5 }, { name: 'oranges', quantity: 1 }, { name: 'apples', quantity: 4 } ];
要合并name相同的对象,累加quantity值并保留单个对象,可以用Array.reduce()配合临时对象实现:
const result = Object.values( mergedArray.reduce((acc, item) => { // 检查当前name是否已在累加器中 if (acc[item.name]) { // 合并值(这里以累加quantity为例) acc[item.name].quantity += item.quantity; // 如果有其他属性需要合并,比如price,可以按需处理: // acc[item.name].totalPrice += item.price * item.quantity; } else { // 不存在则添加新对象到累加器 acc[item.name] = { ...item }; } return acc; }, {}) ); console.log(result); // 输出: // [ // { name: 'bananas', quantity: 7 }, // { name: 'apples', quantity: 7 }, // { name: 'oranges', quantity: 1 } // ]
核心逻辑说明
reduce遍历数组:用累加器(acc)作为临时存储,键是对象的name,值是合并后的对象。- 判断并合并:如果当前
name已存在,就更新对应属性的值;不存在则将当前对象的副本存入累加器。 - 转成数组:用
Object.values()把临时对象的所有值提取出来,得到最终的合并数组。
扩展场景:多属性合并
如果对象有多个需要合并的属性,比如同时累加quantity和totalWeight,可以修改合并逻辑:
const mergedArray = [ { name: 'bananas', quantity: 2, totalWeight: 0.8 }, { name: 'bananas', quantity: 5, totalWeight: 2.0 } ]; const result = Object.values( mergedArray.reduce((acc, item) => { if (acc[item.name]) { acc[item.name].quantity += item.quantity; acc[item.name].totalWeight += item.totalWeight; } else { acc[item.name] = { ...item }; } return acc; }, {}) ); // 结果:{ name: 'bananas', quantity: 7, totalWeight: 2.8 }
内容的提问来源于stack exchange,提问作者Bruno Middleton
相关产品推荐
相关产品推荐

