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

JS中根据ID匹配合并两个数组对象的实现方法

JavaScript 对象合并:根据匹配ID合并两个数组对象

问题描述

现有两个数组:

  • data 数组存储基础信息,包含name和goalsTable字段(关联ID)
  • goalsData 数组存储详细数据,包含_id(关联ID)、tableData和goalsData字段

需求:当goalsData中的_id与data中的goalsTable匹配时,将两个对象合并,保留原data对象的所有字段,并添加goalsData中的对应字段。

原始数据示例

data数组

const data = [
  { name: '1', goalsTable: '6544b8a5fea0bf50fc0c62fb' },
  { name: '1fork', goalsTable: '6548740f05dc440b5c61c5ac' }
];

goalsData数组

const goalsData = [
  {
    _id: '6544b8a5fea0bf50fc0c62fb',
    tableData: [{}, {}, {}, {}],
    goalsData: { qty: 12 }
  },
  {
    _id: '6548740f05dc440b5c61c5ac',
    tableData: [{}, {}, {}, {}, {}],
    goalsData: { qty: 10 }
  }
];

合并后预期结果

[
  {
    name: '1',
    goalsTable: '6544b8a5fea0bf50fc0c62fb',
    tableData: [{}, {}, {}, {}],
    goalsData: { qty: 12 }
  },
  {
    name: '1fork',
    goalsTable: '6548740f05dc440b5c61c5ac',
    tableData: [{}, {}, {}, {}, {}],
    goalsData: { qty: 10 }
  }
]

解决方案

方法1:基础实现(小数据量适用)

使用Array.map()遍历data数组,结合Array.find()查找匹配的goalsData项,通过对象展开运算符...合并对象。

const mergedData = data.map(item => {
  // 查找匹配的目标数据
  const matchedItem = goalsData.find(goal => goal._id === item.goalsTable);
  // 找到则合并,否则返回原对象
  return matchedItem ? { ...item, ...matchedItem } : item;
});

console.log(mergedData);

方法2:性能优化版(大数据量适用)

先将goalsData转换为以_id为键的Map,后续查找操作的时间复杂度从O(n)降为O(1),适合处理大规模数据。

// 构建_id到目标对象的映射Map
const goalsMap = new Map(goalsData.map(item => [item._id, item]));

const mergedData = data.map(item => {
  // 通过Map快速查找匹配项
  const matchedItem = goalsMap.get(item.goalsTable);
  return matchedItem ? { ...item, ...matchedItem } : item;
});

console.log(mergedData);

注意事项

如果_id和goalsTable是MongoDB的ObjectId类型(而非字符串),需要先转换为字符串再比较,避免因引用类型导致匹配失败:

// 针对ObjectId的匹配逻辑
const matchedItem = goalsData.find(goal => goal._id.toString() === item.goalsTable.toString());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:31