You need to enable JavaScript to run this app. JavaScript基于id实现对象数组合并:匹配替换、未匹配项自动追加
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 11:45:08