You need to enable JavaScript to run this app. 如何基于ID匹配合并两组对象数组并自动补全unread字段值
优惠活动
大模型
产品
解决方案
定价
更多

如何基于ID匹配合并两组对象数组并自动补全unread字段值

实现方案

实现思路

  • 先把arrObj1转换为以ID为键、unread值为值的映射结构,单次遍历即可完成,后续查找时间复杂度为O(1)
  • 以arrObj2为基准做遍历,每个元素根据ID从映射中取对应unread值,取不到就默认补0
  • 为了不修改原数组的元素,对arrObj2的每个对象做浅拷贝后再合并属性

代码实现(推荐Map版本)

let arrObj1 = [{"ID":5045,"unread":1},{"ID":5058,"unread":2}];
let arrObj2 = [{"ID":3006,"id":"818", "From":"user1@mail.com"},{"ID":5045,"id":"2503", "From":"user2@mail.com"},{"ID":5058,"id":"2509", "From":"user3@mail.com"}];

// 生成ID-unread映射表
const unreadMap = new Map(arrObj1.map(item => [item.ID, item.unread]));

// 生成最终结果
const result = arrObj2.map(item => ({
  ...item,
  unread: unreadMap.get(item.ID) ?? 0
}));

如果运行环境不支持空值合并运算符??,可以替换为以下写法:

unread: unreadMap.has(item.ID) ? unreadMap.get(item.ID) : 0

普通对象版本(兼容更旧的环境)

const unreadObj = arrObj1.reduce((acc, cur) => {
  acc[cur.ID] = cur.unread;
  return acc;
}, {});

const result = arrObj2.map(item => ({
  ...item,
  unread: unreadObj[item.ID] ?? 0
}));

两种方案的时间复杂度均为O(n+m),n为arrObj1长度、m为arrObj2长度,数据量较大时也能保持高效运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 15:06:03