deepAssign / shallowAssign / deepAssignArr / shallowAssignArr
deepAssign方法用于代替 Object.assign,合并两个对象且尽可能不改变指针,支持自定义匹配规则。shallowAssign 是其浅层版本,只对对象属性递归,数组直接赋值。deepAssignArr 用于合并数组,支持通过 matchFunc 标识配对合并。shallowAssignArr 是浅层数组合并版本。
语法
deepAssign(obj1, obj2, matchFunc?, notUseMatch?)
shallowAssign(obj1, obj2, matchFunc?)
deepAssignArr(arr1, arr2, matchFunc?, notUseMatch?)
shallowAssignArr(arr1, arr2, matchFunc?)描述
deepAssign方法递归地将 obj2 的内容合并到 obj1 中,直接修改 obj1 原对象,保持指针不变。与 deepMerge 不同,deepAssign 以 obj2 的键为遍历基准,不会删除 obj1 中存在但 obj2 中不存在的键。当遇到对象属性时递归合并,遇到数组属性时调用 deepAssignArr 进行数组合并。
shallowAssign 是 deepAssign 的浅层版本,只对对象属性进行递归合并,数组属性直接赋值,适用于不需要深度合并数组的场景。
deepAssignArr 用于合并两个数组。当提供 matchFunc 时,通过匹配函数标识配对合并(如按 id 匹配);未匹配到的项会被追加到 arr1 末尾。当未提供 matchFunc 或 notUseMatch 返回 true 时,按索引顺序覆盖合并。
shallowAssignArr 是 deepAssignArr 的浅层版本,使用 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 原数组。
注意事项
- 所有函数都会直接修改
obj1或arr1(原对象/原数组),请确保这是预期的行为 deepAssign不会删除obj1中存在但obj2中不存在的键(与deepMerge不同)shallowAssign只对对象属性递归合并,数组属性直接赋值,不调用deepAssignArrdeepAssignArr中,当arr2全部为非对象元素时,会先清空arr1再赋值matchFunc仅对数组中的对象元素生效,非对象元素按索引赋值notUseMatch为true时,即使提供了matchFunc也会按索引顺序覆盖合并- 依赖 ramda 的
type进行类型判断
示例
deepAssign 基础用法
deepAssign 数组匹配合并
shallowAssign 浅层合并
deepAssignArr 配对合并
浏览器兼容
deepAssign、shallowAssign、deepAssignArr、shallowAssignArr 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。
性能考虑
- 时间复杂度: O(n) - 需要遍历对象的所有属性,其中 n 为属性总数
- 空间复杂度: O(d) - 递归调用栈深度取决于对象嵌套深度 d
deepAssignArr在使用matchFunc时,对每个arr2元素需遍历arr1寻找匹配项,最坏情况下为 O(m×k),其中 m 和 k 分别为两个数组的长度- 使用 ramda 的
type进行类型判断,开销较小 - 对象合并保持指针稳定,适用于 Vue 等需要保持引用一致性的场景
相关函数
- deepMerge - 代替直接赋值的深度合并,键名以 obj2 为准
- deepDiff - 查询两个对象的差异
- deepConvert - 深度遍历对象并根据规则进行数据处理