Skip to content

deepAssign / shallowAssign / deepAssignArr / shallowAssignArr

deepAssign方法用于代替 Object.assign,合并两个对象且尽可能不改变指针,支持自定义匹配规则。shallowAssign 是其浅层版本,只对对象属性递归,数组直接赋值。deepAssignArr 用于合并数组,支持通过 matchFunc 标识配对合并。shallowAssignArr 是浅层数组合并版本。

语法

javascript
deepAssign(obj1, obj2, matchFunc?, notUseMatch?)
shallowAssign(obj1, obj2, matchFunc?)
deepAssignArr(arr1, arr2, matchFunc?, notUseMatch?)
shallowAssignArr(arr1, arr2, matchFunc?)

描述

deepAssign方法递归地将 obj2 的内容合并到 obj1 中,直接修改 obj1 原对象,保持指针不变。与 deepMerge 不同,deepAssignobj2 的键为遍历基准,不会删除 obj1 中存在但 obj2 中不存在的键。当遇到对象属性时递归合并,遇到数组属性时调用 deepAssignArr 进行数组合并。

shallowAssigndeepAssign 的浅层版本,只对对象属性进行递归合并,数组属性直接赋值,适用于不需要深度合并数组的场景。

deepAssignArr 用于合并两个数组。当提供 matchFunc 时,通过匹配函数标识配对合并(如按 id 匹配);未匹配到的项会被追加到 arr1 末尾。当未提供 matchFuncnotUseMatch 返回 true 时,按索引顺序覆盖合并。

shallowAssignArrdeepAssignArr 的浅层版本,使用 shallowAssign 代替 deepAssign 进行对象合并。

参数

deepAssign / shallowAssign

obj1 object

  被合并的目标对象,会被直接修改,默认 {}

obj2 object

  合并的来源对象,默认 {}

matchFunc Function|null

  可选。自定义匹配规则,用于数组合并时标识配对项。例:(a, b) => a.id === b.id

notUseMatch Function|null

  可选(仅 deepAssign)。判断是否跳过匹配规则、改用顺序覆盖。接收 (arr1, arr2) 两个数组参数,返回 true 时不使用匹配规则。例:(arr1, arr2) => !arr1?.[0]?.id || !arr2?.[0]?.id

deepAssignArr / shallowAssignArr

arr1 array

  被合并的目标数组,会被直接修改。

arr2 array

  合并的来源数组。

matchFunc Function|null

  可选。匹配函数,用于标识数组中对象的配对关系。例:(a, b) => a.id === b.id

notUseMatch Function|null

  可选(仅 deepAssignArr)。判断是否跳过匹配规则。例:(arr1, arr2) => !arr1?.[0]?.id || !arr2?.[0]?.id

返回值

deepAssign / shallowAssign

object

  返回 obj1(被修改后的原对象)。

deepAssignArr / shallowAssignArr

undefined

  无返回值,直接修改 arr1 原数组。

注意事项

  • 所有函数都会直接修改 obj1arr1(原对象/原数组),请确保这是预期的行为
  • deepAssign 不会删除 obj1 中存在但 obj2 中不存在的键(与 deepMerge 不同)
  • shallowAssign 只对对象属性递归合并,数组属性直接赋值,不调用 deepAssignArr
  • deepAssignArr 中,当 arr2 全部为非对象元素时,会先清空 arr1 再赋值
  • matchFunc 仅对数组中的对象元素生效,非对象元素按索引赋值
  • notUseMatchtrue 时,即使提供了 matchFunc 也会按索引顺序覆盖合并
  • 依赖 ramda 的 type 进行类型判断

示例

deepAssign 基础用法

deepAssign 数组匹配合并

shallowAssign 浅层合并

deepAssignArr 配对合并

浏览器兼容

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

性能考虑

  • 时间复杂度: O(n) - 需要遍历对象的所有属性,其中 n 为属性总数
  • 空间复杂度: O(d) - 递归调用栈深度取决于对象嵌套深度 d
  • deepAssignArr 在使用 matchFunc 时,对每个 arr2 元素需遍历 arr1 寻找匹配项,最坏情况下为 O(m×k),其中 m 和 k 分别为两个数组的长度
  • 使用 ramda 的 type 进行类型判断,开销较小
  • 对象合并保持指针稳定,适用于 Vue 等需要保持引用一致性的场景

相关函数

  • deepMerge - 代替直接赋值的深度合并,键名以 obj2 为准
  • deepDiff - 查询两个对象的差异
  • deepConvert - 深度遍历对象并根据规则进行数据处理