@corex/deepmerge
Version:
A zero dependency object merger with typescript support and built in common merge utilities.
188 lines (149 loc) • 2.88 kB
Markdown
title: '@corex/deepmerge'
custom_edit_url: 'https://github.com/iamvishnusankar/corex/edit/master/packages/deepmerge/README.md'
A zero dependency object merger with typescript support and built in common merge utilities. Support merging of n number of objects
## Installation
```
yarn add @corex/deepmerge
```
## Usage
```ts
import { merge } from '@corex/deepmerge'
merge([obj1, obj2, obj3], { options })
```
## Merge Options
| property | default | description |
| -------------- | --------- | ---------------------------------------------------------------------------------------------------- |
| arrayMergeType | `combine` | Merge two array by concatenation and remove duplicates. Available options are `combine`, `overwrite` |
| arrayMerge | - | Custom merge function to handle array merging. |
## Simple Object Merge
```ts
const obj1 = {
a: 1,
b: {
c: 2,
},
}
const obj2 = {
a: 2,
b: {
c: 4,
d: 5,
},
}
const result = merge([obj1, obj2])
console.log(result)
// {
// a: 2,
// b: {
// c: 4,
// d: 5,
// },
// }
```
## Array Merge
```ts
const arr1 = {
a: [1, 2, 3],
}
const arr2 = {
a: [3, 4, 5],
}
const result = merge([arr1, arr2])
console.log(result)
// result = {
// a: [1, 2, 3, 4, 5],
// }
```
## Complex Merge
```ts
const obj1 = {
a: 2,
b: (x: number, y: number) => x + y,
c: [1, 2, 4],
d: {
e: [4, 5, 7],
},
}
console.log(obj1.b(7, 5)) // ==> 12
const obj2 = {
a: 10,
b: (x: number, y: number) => x / y,
c: [20, 30],
d: {
e: [4, 7, 5],
f: {
g: 'another',
},
},
}
const obj3 = {
b: (x: number, y: number) => x * y,
c: [1, 2, 4],
d: {
e: [4, 7, 5],
},
}
const result = merge([obj1, obj2, obj3])
console.log(result.b(7, 5)) // ==> 35
```
## Array merge types
By default `@corex/deepmerge` uses combine merge. However user can implement their own methods to perform merge or use the built in `overwrite`.
### Overwrite merge
```ts
const obj1 = {
a: [1, 2, 3],
b: ['c', 'd'],
c: {
d: [1, 2],
},
}
const obj2 = {
a: [1, 7, 6],
b: ['e', 'f'],
c: {
d: [9, 10],
},
}
const obj3 = {
a: [20, 40],
}
const result = merge([obj1, obj2, obj3], {
arrayMergeType: 'overwrite',
})
console.log(result)
// result = {
// a: [20, 40],
// b: ['e', 'f'],
// c: {
// d: [9, 10],
// },
// }
```
### Custom merge function
```ts
const obj1 = {
a: ['1', '2'],
c: {
d: [1000, 500],
},
}
const obj2 = {
a: ['4', '5'],
c: {
d: [60, 80],
},
}
const customMergeFn = (_: any[], __: any[]) => 42
const result = merge([obj1, obj2], {
arrayMerge: customMergeFn,
})
console.log(result)
// {
// a: 42,
// c: {
// d: 42,
// },
// }
```