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

如何在JavaScript中比较两个对象数组,匹配时为对象添加键值对

按ID匹配合并对象数组属性

需求场景

我有两个对象数组:

let paymentType = [
  {id: "settle", set: "dis_10"},
  {id: "settle1", set: "dis_20"},
  {id: "settle2", set: "dis_30"},
]
let result = [
  {id: "settle", type: 40},
  {id: "settle4", type: 50},
  {id: "settle2", type: 60},
]

需要实现:当两个数组中的id匹配时,将paymentType中的set属性添加到result的对应对象中,最终得到如下结果:

let result = [
  {id: "settle", type: 40, set: "dis_10"},
  {id: "settle4", type: 50},
  {id: "settle2", type: 60},
]

之前尝试用filter和some方法,没得到预期效果。

高效解决方案

推荐先将paymentType转换为以id为键的Map,把查找匹配项的时间复杂度降到O(1),再遍历result数组完成属性合并:

// 将paymentType转为Map,键是id,值是对应的set属性
const paymentMap = new Map(paymentType.map(item => [item.id, item.set]));

// 遍历result数组,合并匹配的set属性
const updatedResult = result.map(item => {
  const setValue = paymentMap.get(item.id);
  // 找到匹配项就合并属性,否则返回原对象
  return setValue ? {...item, set: setValue} : item;
});

console.log(updatedResult);

关于filter和some的问题说明

filter的作用是过滤数组元素,而我们需要的是修改数组内对象的属性,不是筛选元素;some仅用于判断是否存在匹配项,无法直接帮我们添加属性。如果一定要用这两个方法实现,写法会繁琐且效率较低(每次遍历都要多次扫描paymentType数组):

const updatedResult = result.map(item => {
  // 先判断是否存在匹配的id
  const hasMatch = paymentType.some(payment => payment.id === item.id);
  if (hasMatch) {
    // 找到匹配的对象并合并属性
    const matchedItem = paymentType.find(payment => payment.id === item.id);
    return {...item, set: matchedItem.set};
  }
  return item;
});

这种写法在数组元素较多时,性能会明显不如Map方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:55:29