如何基于第二个数组对两个对象数组进行比较、合并与排序
按指定数组排序并合并对象数组需求实现
现有两个对象数组arr1和arr2,需要完成两个核心操作:
- 以
arr2的name顺序为基准,对arr1进行排序 - 合并两个数组中
name匹配的对象属性,保留arr1的属性优先级(即属性重复时,arr1的值覆盖arr2)
原始数组
const arr1 = [{ name: 'jimmy', age: 33, sport: 'football' }, { name: 'Sam', age: 35 }, { name: 'Ricky', age: 32, sport: 'hockey' }, { name: 'johnson', age: 30 }, ]; const arr2 = [{ name: 'jimmy', age: 33, item: 'not found' }, { name: 'Sam', age: 38 }, { name: 'johnson', age: 30 }, { name: 'Ricky', age: 32 }, ];
现有代码的问题
你提供的代码仅完成了对象属性合并,但未实现按arr2顺序排序的功能,且代码中new Map([...el1.entries()].sort())属于冗余代码,无实际作用。
正确实现方案
通过以下步骤完成需求:
- 将
arr1转换为以name为键的对象映射,快速通过name查找对应对象,提升处理效率 - 遍历
arr2,按其顺序取出arr1中对应对象,进行属性合并(arr1属性在前,确保优先级) - 若
arr2存在arr1没有的name,可根据需求决定是否保留,此处按示例仅处理两边共有的对象
实现代码:
// 把arr1转为以name为键的映射表 const arr1Map = arr1.reduce((map, item) => { map[item.name] = item; return map; }, {}); // 按arr2的顺序合并并生成最终数组 const arMerge = arr2.map(item2 => { const item1 = arr1Map[item2.name]; return item1 ? {...item2, ...item1} : item2; }); console.log(arMerge);
预期输出结果
[ { name: 'jimmy', age: 33, item: 'not found', sport: 'football' }, { name: 'Sam', age: 35 }, { name: 'johnson', age: 30 }, { name: 'Ricky', age: 32, sport: 'hockey' } ]
内容的提问来源于stack exchange,提问作者johnson
相关产品推荐
相关产品推荐

