Skip to content

deepMerge (深度合并)

deepMerge 函数用于深度合并多个对象。该函数会递归地合并源对象到目标对象,支持处理数组、日期对象和避免循环引用。

函数调用方式

javascript
deepMerge(target, ...sources)

参数说明

参数名类型描述
targetObject目标对象,合并的结果将存储在此对象中。必须是一个非空对象。
sourcesObject一个或多个源对象,属性将被合并到目标对象中。

返回值

返回合并后的目标对象。

异常处理

  • 如果 target 不是一个非空对象,函数将抛出错误,提示信息为 'Target must be a non-null object'

合并规则

  1. 基本类型:如果源对象的属性值是基本类型(如字符串、数字、布尔值),则直接赋值。
  2. 对象合并:如果源对象的属性值是对象,并且目标对象中对应属性值也是对象,则递归合并。
  3. 数组合并:如果源对象的属性值是数组,且目标对象中对应属性值也是数组,则合并这两个数组;否则,将源数组赋值给目标。
  4. 日期对象:如果源对象中的属性值是日期对象,则会创建一个新的日期对象。
  5. 循环引用:使用 WeakSet 跳过已经处理过的对象,避免循环引用导致的无限递归。

示例代码

基本用法

javascript
const target = { a: 1, b: { x: 10 } };
const source1 = { b: { y: 20 }, c: 3 };
const source2 = { a: 2, b: { x: 15 } };

const merged = deepMerge(target, source1, source2);
console.log(merged); 
// 输出: { a: 2, b: { x: 15, y: 20 }, c: 3 }

数组合并示例

javascript
const target = { a: [1, 2] };
const source = { a: [3, 4], b: 5 };

const merged = deepMerge(target, source);
console.log(merged); 
// 输出: { a: [1, 2, 3, 4], b: 5 }

日期对象示例

javascript
const target = {};
const source = { date: new Date('2021-01-01') };

const merged = deepMerge(target, source);
console.log(merged.date instanceof Date); 
// 输出: true

错误处理示例

javascript
try {
    deepMerge(null, { a: 1 });
} catch (error) {
    console.error(error.message); // 输出: 'Target must be a non-null object'
}

结论

deepMerge 函数提供了一种强大的方式来合并多个对象,支持复杂的数据结构和类型。通过合理处理日期、数组和避免循环引用,使得该函数非常适用于需要深度合并对象的场景。