TypeScript如何合并name和car相同的对象并求和value1与value2
按name和car合并对象并求和value1/value2的TypeScript实现
我有如下对象数组:
public names: Array<any> = [ {name: 'John', car:'BMW', value1: 500, value2: 350}, {name: 'John', car:'AUDI', value1: 500, value2: 350}, {name: 'John', car:'AUDI', value1: 250, value2: 200}, {name: 'Paul', car: 'AUDI', value1: 290, value2: 200}, {name: 'John', car:'BMW', value1: 600, value2: 360}, {name: 'John', car:'BMW', value1: 500, value2: 350}, {name: 'Paul', car: 'AUDI', value1: 120, value2: 50}, {name: 'John', car:'BMW', value1: 100, value2: 100}, ];
希望以共同的name和car为依据合并对象,对value1和value2的值求和,预期结果:
[ {name: 'John', car:'BMW', value1: 1700, value2: 1160}, {name: 'John', car:'AUDI', value1: 750, value2: 550}, {name: 'Paul', car: 'AUDI', value1: 410, value2: 250} ]
尝试用reduce方法实现,但遇到类型处理错误。
正确实现方案
首先定义明确的类型替代any,从根源解决类型问题,再用reduce完成合并求和:
// 定义数组元素的类型 interface Item { name: string; car: string; value1: number; value2: number; } // 替换原any类型数组 public names: Item[] = [ {name: 'John', car:'BMW', value1: 500, value2: 350}, {name: 'John', car:'AUDI', value1: 500, value2: 350}, {name: 'John', car:'AUDI', value1: 250, value2: 200}, {name: 'Paul', car: 'AUDI', value1: 290, value2: 200}, {name: 'John', car:'BMW', value1: 600, value2: 360}, {name: 'John', car:'BMW', value1: 500, value2: 350}, {name: 'Paul', car: 'AUDI', value1: 120, value2: 50}, {name: 'John', car:'BMW', value1: 100, value2: 100}, ]; // 合并求和逻辑 const mergedItems = this.names.reduce((acc: Record<string, Item>, current) => { // 用name+car作为唯一标识键 const key = `${current.name}-${current.car}`; if (!acc[key]) { // 首次出现该组合,存入副本 acc[key] = {...current}; } else { // 已存在该组合,累加数值 acc[key].value1 += current.value1; acc[key].value2 += current.value2; } return acc; }, {}); // 转换为目标数组格式 const result = Object.values(mergedItems);
核心要点
- 用
Item接口明确类型,避免any带来的类型推断错误 - 拼接
name和car作为唯一键,确保同组合对象被正确归类 - 给
reduce的累加器指定Record<string, Item>类型,符合TypeScript类型校验要求 - 最后通过
Object.values将累加器对象转为数组,得到预期结构
内容的提问来源于stack exchange,提问作者Kalla
相关产品推荐
相关产品推荐

