Skip to content

deepMerge

deepMerge方法用于代替直接赋值方式合并两个对象,尽可能不改变指针。键名以 obj2 为主,obj1 中存在但 obj2 中不存在的键名会被删除。数组合并时会先清空再 splice。

语法

javascript
deepMerge(obj1, obj2)

描述

deepMerge方法递归地将 obj2 的内容合并到 obj1 中,直接修改 obj1 原对象,保持指针不变。该函数以 obj2 的键名为基准,obj1 中存在而 obj2 中不存在的键会被删除;obj2 中存在而 obj1 中不存在的键会被添加。对于对象类型的属性,递归合并;对于数组类型的属性,先清空原数组再 splice 新内容;对于其他类型的属性,直接赋值。

该函数依赖 ramda 的 equals 进行深度比较,以减少不必要的赋值操作。

参数

obj1 object|array

  被合并的目标对象(或数组),会被直接修改。

obj2 object|array

  合并的来源对象(或数组),键名以此为基准。

返回值

undefined

  无返回值,直接修改 obj1 原对象。

注意事项

  • 该函数会直接修改 obj1(原对象),请确保这是预期的行为
  • 键名以 obj2 为主,obj1 中存在但 obj2 中不存在的键名会被 delete 删除
  • 数组合并时会先通过 obj1.length = 0 清空原数组,再通过 splice 写入 obj2 的内容,保持数组指针不变
  • obj1 为数组时,直接清空并 splice obj2 的内容后返回
  • 依赖 ramda 的 equals 进行深度比较,存在一定的时空复杂度开销
  • 仅对纯对象([object Object])递归合并,对其他引用类型(如 Date、RegExp 等)会直接赋值

示例

基础用法

数组合并

键名删除

浏览器兼容

deepMerge 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。

性能考虑

  • 时间复杂度: O(n) - 需要遍历两个对象的所有键,其中 n 为对象属性总数
  • 空间复杂度: O(d) - 递归调用栈深度取决于对象嵌套深度 d
  • 使用 ramda 的 equals 进行深度比较,在大对象上可能产生额外开销
  • 数组操作使用 splice 替代重新赋值,保持指针稳定但存在拷贝成本

相关函数

  • deepAssign - 代替 Object.assign 的深度合并,支持自定义匹配规则
  • shallowAssign - 浅层对象合并
  • deepDiff - 查询两个对象的差异
  • deepConvert - 深度遍历对象并根据规则进行数据处理