JavaScript基于id实现对象数组合并:匹配替换、未匹配项自动追加
合并数组功能扩展实现
核心调整点
- 保留原有链式调用的使用方式,不需要修改现有业务代码的调用习惯
- 替换原实现中嵌套遍历查找的逻辑,改用id索引表降低匹配的时间复杂度
- 新增arr2未匹配项的筛选逻辑,将无对应id的对象自动追加到结果末尾
优化后代码
function mergeById(arr) { return { with: function(arr2) { // 基于id生成两个数组的索引映射 const arr1IdIndex = _.keyBy(arr, 'id') const arr2IdIndex = _.keyBy(arr2, 'id') // 完成同id对象的替换逻辑 const replacedBase = _.map(arr1IdIndex, (item, id) => { return arr2IdIndex[id] || item }) // 筛选arr2中未在arr1出现的id对应对象 const unMatchedExtra = _.filter(arr2IdIndex, (item, id) => { return !arr1IdIndex[id] }) // 拼接得到最终合并数组 return [...replacedBase, ...unMatchedExtra] } } } // 原有测试调用逻辑完全兼容 var result = mergeById([{ id: '124', name: 'qqq' }, { id: '589', name: 'www' }, { id: '567', name: 'rrr' } ]) .with([{ id: '124', name: 'ttt' }, { id: '45', name: 'yyy' }])
实现效果说明
- 最终输出完全匹配预期结构:arr1中的对象如果在arr2找到同id项,会被arr2的对象完整替换;arr2中没有对应id匹配的对象,会被完整追加到结果数组末尾
- 元素顺序与输入保持一致:arr1的原有元素顺序不改动,追加的额外项顺序与arr2中的原始排列顺序相同
- 所有操作不会修改原始输入数组,不会产生意外的副作用
- 相比原实现的嵌套查找逻辑,改用索引表的方式将匹配的时间复杂度从O(n*m)降到O(n+m),数据量较大时性能提升明显
内容的提问来源于stack exchange,提问作者arunmmanoharan
相关产品推荐
相关产品推荐

