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
相关产品推荐
相关产品推荐

