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

如何基于第二个数组对两个对象数组进行比较、合并与排序

按指定数组排序并合并对象数组需求实现

现有两个对象数组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())属于冗余代码,无实际作用。

正确实现方案

通过以下步骤完成需求:

  1. 将arr1转换为以name为键的对象映射,快速通过name查找对应对象,提升处理效率
  2. 遍历arr2,按其顺序取出arr1中对应对象,进行属性合并(arr1属性在前,确保优先级)
  3. 若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 07:14:58