-
Notifications
You must be signed in to change notification settings - Fork 0
/
deepMerge.ts
30 lines (29 loc) · 870 Bytes
/
deepMerge.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Deeply merges two objects, using a function to handle keys present in both.
* @param a - The first object.
* @param b - The second object.
* @param fn - The function to use to handle keys present in both objects.
* @returns The merged object.
* @public
* @example
* ```typescript
* deepMerge(
* { a: true, b: { c: [1, 2, 3] } },
* { a: false, b: { d: [1, 2, 3] } },
* (key, a, b) => (key === 'a' ? a && b : Object.assign({}, a, b))
* );
* // { a: false, b: { c: [ 1, 2, 3 ], d: [ 1, 2, 3 ] } }
* ```
* @since 0.1.13
* @category Object
*/
const deepMerge = (
a: Record<string, any>,
b: Record<string, any>,
fn: (key: string, a: any, b: any) => Record<string, any>
) =>
[...new Set([...Object.keys(a), ...Object.keys(b)])].reduce(
(acc, key) => ({ ...acc, [key]: fn(key, a[key], b[key]) }),
{}
);
export default deepMerge;