deepMerge (深度合并)
deepMerge
函数用于深度合并多个对象。该函数会递归地合并源对象到目标对象,支持处理数组、日期对象和避免循环引用。
函数调用方式
javascript
deepMerge(target, ...sources)
参数说明
参数名 | 类型 | 描述 |
---|---|---|
target | Object | 目标对象,合并的结果将存储在此对象中。必须是一个非空对象。 |
sources | Object | 一个或多个源对象,属性将被合并到目标对象中。 |
返回值
返回合并后的目标对象。
异常处理
- 如果
target
不是一个非空对象,函数将抛出错误,提示信息为'Target must be a non-null object'
。
合并规则
- 基本类型:如果源对象的属性值是基本类型(如字符串、数字、布尔值),则直接赋值。
- 对象合并:如果源对象的属性值是对象,并且目标对象中对应属性值也是对象,则递归合并。
- 数组合并:如果源对象的属性值是数组,且目标对象中对应属性值也是数组,则合并这两个数组;否则,将源数组赋值给目标。
- 日期对象:如果源对象中的属性值是日期对象,则会创建一个新的日期对象。
- 循环引用:使用
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
函数提供了一种强大的方式来合并多个对象,支持复杂的数据结构和类型。通过合理处理日期、数组和避免循环引用,使得该函数非常适用于需要深度合并对象的场景。