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为数组时,直接清空并 spliceobj2的内容后返回 - 依赖 ramda 的
equals进行深度比较,存在一定的时空复杂度开销 - 仅对纯对象(
[object Object])递归合并,对其他引用类型(如 Date、RegExp 等)会直接赋值
示例
基础用法
数组合并
键名删除
浏览器兼容
deepMerge 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。
性能考虑
- 时间复杂度: O(n) - 需要遍历两个对象的所有键,其中 n 为对象属性总数
- 空间复杂度: O(d) - 递归调用栈深度取决于对象嵌套深度 d
- 使用 ramda 的
equals进行深度比较,在大对象上可能产生额外开销 - 数组操作使用
splice替代重新赋值,保持指针稳定但存在拷贝成本
相关函数
- deepAssign - 代替 Object.assign 的深度合并,支持自定义匹配规则
- shallowAssign - 浅层对象合并
- deepDiff - 查询两个对象的差异
- deepConvert - 深度遍历对象并根据规则进行数据处理