如何基于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
相关产品推荐
相关产品推荐

