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

JavaScript如何合并两个对象数组并为匹配项新增对比字段

JS/TS 车辆数组合并需求实现

原始数据

现有如下两个车辆数组:

const goodCars = [
    { name: 'ferrari', price: 22000, condition: { isGood: true, isBad: false } },
    { name: 'ford', price: 21000, condition: { isGood: true, isBad: false } },
    { name: 'bmw', price: 20000, condition: { isGood: true, isBad: false } },
  ];

const badCars = [
    { name: 'ford', price: 1111, condition: { isGood: false, isBad: true } },
    { name: 'honda', price: 8000, condition: { isGood: false, isBad: true } },
  ];

预期输出

需要合并得到如下最终数组:

const finalCarList = [
    { name: 'ferrari', price: 22000, condition: { isGood: true, isBad: false } },
    {
      name: 'ford',
      price: 21000,
      condition: { isGood: true, isBad: false },
      toCompareWith: { name: 'ford', price: 1111, condition: { isGood: false, isBad: true } },
    },
    { name: 'bmw', price: 20000, condition: { isGood: true, isBad: false } },
    { name: 'honda', price: 8000, condition: { isGood: false, isBad: true } },
  ];

具体需求

  • 合并goodCars和badCars两个数组
  • 若同一款车在两个数组中都存在,给goodCars中的对应对象新增toCompareWith字段,存储badCars中匹配的车辆对象
  • 无匹配的车辆直接加入结果数组即可

错误实现问题

最初尝试的嵌套map写法无法得到正确结果:

goodCars.map((gc) => {
    badCars.map((bc) => {
      if (isCarMatch(gc, bc)) {
        finalCarList = [
          ...finalCarList,
          { ...gc, toCompareWith: bc },
        ];
      }
    });
 });

该写法仅会把两个数组中匹配到的车辆加入结果,未匹配的goodCars条目、未匹配的badCars条目都会被遗漏,不符合需求。

正确实现

let finalCarList: Array<Car> = [...goodCars];

badCars?.forEach((bc) => {
  const match: Car | undefined = goodCars.find((gc) => isCarMatch(gc, bc));
  match
    ? (match.toCompareWith = bc) // 匹配到则给goodCars的对应条目加对比字段
    : (finalCarList = [...finalCarList, bc]); // 未匹配到则直接加入结果数组
});

实现逻辑:先把所有goodCars条目作为初始结果,再遍历badCars的每一项,匹配到good里的条目就加字段,没匹配到就直接塞进结果数组,逻辑简洁且覆盖所有场景。


内容的提问来源于stack exchange,提问作者arled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:05