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

如何使用原生JavaScript合并两个对象数组?

优化两个对象数组的合并逻辑(避免嵌套循环)

需求说明

现有两个对象数组,需要将员工数组中每个元素的job_id字段替换为职位数组中对应的完整职位对象,同时希望避免嵌套循环以提升效率。

原始数组

let employees = [
  { name: 'Jason', job_id: '101' },
  { name: 'Sarah', job_id: '102' },
  { name: 'Jack', job_id: '102' }
]

let jobs = [
  { job_id: '101', position: 'Designer' },
  { job_id: '102', position: 'Developer' }
]

期望合并结果

注:你给出的示例中[job_id: ...]是语法错误,数组不支持键值对写法,正确格式应为对象{}:

let employees = [
  { name: 'Jason', job_id: { job_id: '101', position: 'Designer' } },
  { name: 'Sarah', job_id: { job_id: '102', position: 'Developer' } },
  { name: 'Jack', job_id: { job_id: '102', position: 'Developer' } }
]

当前实现(嵌套循环)

employees.forEach(employee => {
  for (let index = 0; index < jobs.length; index++) {
    if (employee.job_id == jobs[index].job_id) {
      employee.job_id= jobs[index];
    }
  }
})

优化方案:构建查找表降低时间复杂度

通过Map构建职位ID到职位对象的映射表,将查找操作的时间复杂度从O(n)降到O(1),整体时间复杂度从O(m*n)优化为O(m+n)(m为员工数,n为职位数)。

修改原数组的实现

// 构建job_id与职位对象的映射
const jobMap = new Map(jobs.map(job => [job.job_id, job]));

// 遍历员工数组替换字段
employees.forEach(employee => {
  // 找不到对应职位时保留原job_id值
  employee.job_id = jobMap.get(employee.job_id) || employee.job_id;
});

返回新数组(不修改原数组)

如果需要保留原数组不变,可以使用map方法生成新数组:

const jobMap = new Map(jobs.map(job => [job.job_id, job]));

const mergedEmployees = employees.map(employee => ({
  ...employee,
  job_id: jobMap.get(employee.job_id) || employee.job_id
}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:20:25