Node.js中基于ID匹配合并两个对象数组的实现需求
嘿,这个需求很常见,我给你两种实用的JavaScript实现方案,你可以根据自己的数据量来选:
方法1:map() + find() 组合(直观易读,适合小数据量)
这种方法逻辑直白,很容易理解,适合数据规模不大的场景:
const data1 = [{ foo: '2', box: 'yes', id: '1234' }, { foo: '34', box: 'no', id: '1235' }]; const data2 = [{ key: 'value', anotherKey: 'extraValue', id: '1234' }, { key: 'value', anotherKey: 'extraValue', id: '1235' }]; const finalData = data1.map(itemFromData1 => { // 在data2里找到和当前item id匹配的对象 const matchingItemFromData2 = data2.find(itemFromData2 => itemFromData2.id === itemFromData1.id); // 用扩展运算符合并两个对象,万一没找到匹配项就用空对象兜底 return { ...itemFromData1, ...(matchingItemFromData2 || {}) }; }); console.log(finalData);
方法2:先建映射再合并(性能更优,适合大数据量)
如果你的数组里有很多对象,反复用find()遍历数组会有点低效。咱们可以先把data2转成以id为键的对象映射,之后直接通过id取值,效率会高很多:
const data1 = [{ foo: '2', box: 'yes', id: '1234' }, { foo: '34', box: 'no', id: '1235' }]; const data2 = [{ key: 'value', anotherKey: 'extraValue', id: '1234' }, { key: 'value', anotherKey: 'extraValue', id: '1235' }]; // 用reduce把data2转成 { '1234': 对应对象, '1235': 对应对象 } 的格式 const data2IdMap = data2.reduce((map, item) => { map[item.id] = item; return map; }, {}); // 遍历data1,直接通过id从映射里取对应对象合并 const finalData = data1.map(item => ({ ...item, ...data2IdMap[item.id] || {} })); console.log(finalData);
额外注意点
- 如果两个数组里的对象有相同的非id属性(比如data1和data2都有
foo键),后面的对象属性会覆盖前面的。比如上面的代码里,data2的属性会覆盖data1的,如果想保留data1的属性,把合并顺序反过来就行:{ ...(data2IdMap[item.id] || {}), ...item }。 - 假设每个id在两个数组里都有对应项,如果存在data1里有id但data2里没有的情况,上面的代码会保留data1的所有属性,不会添加额外内容,这是合理的处理方式。
内容的提问来源于stack exchange,提问作者Navid Yousefzai
相关产品推荐
相关产品推荐

