You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:05:14