deepmerge-plus
Version:
用於深度(遞迴)合併 JavaScript 物件的函式庫 / A library for deep (recursive) merging of JavaScript objects
216 lines (161 loc) • 5.07 kB
Markdown
deepmerge-plus
=============
> 深度合併兩個物件的可列舉屬性 / Merge the enumerable attributes of two objects deeply.
`pnpm add deepmerge-plus`
[***查看從版本 1.x 到 2.0.0 的變更 / Check out the changes from version 1.x to 2.0.0***](https://github.com/KyleAMathews/deepmerge/blob/master/changelog.md#200)
如需舊版(2.0.0 之前)的陣列元素合併演算法,請參閱下方的 [`arrayMerge` 選項](
example
=======
<!--js
var merge = require('./')
-->
```js
var moment = require('moment')
var monday = moment('2016-09-27T01:08:12.761Z')
var tuesday = moment('2016-09-28T01:18:12.761Z')
var target = {
date: monday
}
var source = {
date: tuesday
}
let options = {
isMergeableObject(value, isMergeableObject) {
let bool;
if (bool = moment.isMoment(value)) {
return false;
}
return isMergeableObject(value)
}
}
var expected = {
date: tuesday
}
var actual = merge(target, source, options) // => expected
```
```js
var x = {
foo: { bar: 5 },
array: [{
does: 'work',
too: [ 1, 2, 3 ]
}]
}
var y = {
foo: { baz: 4 },
quux: 5,
array: [{
does: 'work',
too: [ 4, 5, 6 ]
}, {
really: 'yes'
}]
}
var expected = {
foo: {
bar: 5,
baz: 4
},
array: [{
does: 'work',
too: [ 1, 2, 3 ]
}, {
does: 'work',
too: [ 4, 5, 6 ]
}, {
really: 'yes'
}],
quux: 5
}
merge(x, y) // => expected
```
methods
=======
```
var merge = require('deepmerge')
```
merge(x, y, [options])
-----------
深度合併兩個物件 `x`和 `y`,返回一個包含兩者元素的新合併物件。/ Merge two objects `x` and `y` deeply, returning a new merged object with the elements from both `x` and `y`.
若 `x` 和 `y` 的同一個鍵都有元素存在,則結果中會顯示 `y` 的值。/ If an element at the same key is present for both `x` and `y`, the value from `y` will appear in the result.
合併會建立一個新物件,因此 `x` 和 `y` 都不會被修改。/ Merging creates a new object, so that neither `x` or `y` are be modified.
merge.all(arrayOfObjects, [options])
-----------
將任意數量的物件合併成單一結果物件。/ Merges any number of objects into a single result object.
```js
var x = { foo: { bar: 3 } }
var y = { foo: { baz: 4 } }
var z = { bar: 'yay!' }
var expected = { foo: { bar: 3, baz: 4 }, bar: 'yay!' }
merge.all([x, y, z]) // => expected
```
合併預設也會串聯陣列並合併陣列值。/ The merge will also concatenate arrays and merge array values by default.
然而,合併陣列有無限多種有效方式,您可以透過傳入 `arrayMerge` 函式來自訂合併行為。/ However, there are nigh-infinite valid ways to merge arrays, and you may want to supply your own. You can do this by passing an `arrayMerge` function as an option.
```js
function overwriteMerge(destinationArray, sourceArray, options)
{
return sourceArray
}
merge(
[],
[],
{ arrayMerge: overwriteMerge }
) // => [3, 2, 1]
```
若要防止陣列被合併:/ To prevent arrays from being merged:
```js
const dontMerge = (destination, source) => source
const output = merge({ coolThing: [1,2,3] }, { coolThing: ['a', 'b', 'c'] }, { arrayMerge: dontMerge })
output // => { coolThing: ['a', 'b', 'c'] }
```
若要使用舊版(2.0.0 之前)的陣列合併演算法,請傳入此函式:/ To use the old (pre-version-2.0.0) array merging algorithm, pass in this function:
```js
const isMergeableObject = require('is-mergeable-object')
const emptyTarget = value => Array.isArray(value) ? [] : {}
const clone = (value, options) => merge(emptyTarget(value), value, options)
function oldArrayMerge(target, source, optionsArgument) {
const destination = target.slice()
source.forEach(function(e, i) {
if (typeof destination[i] === 'undefined') {
const cloneRequested = !optionsArgument || optionsArgument.clone !== false
const shouldClone = cloneRequested && isMergeableObject(e)
destination[i] = shouldClone ? clone(e, optionsArgument) : e
} else if (isMergeableObject(e)) {
destination[i] = merge(target[i], e, optionsArgument)
} else if (target.indexOf(e) === -1) {
destination.push(e)
}
})
return destination
}
merge(
[{ a: true }],
[{ b: true }, 'ah yup'],
{ arrayMerge: oldArrayMerge }
) // => [{ a: true, b: true }, 'ah yup']
```
*已棄用 / *Deprecated.*
預設值為 `true`。/ Defaults to `true`.
若 `clone` 為 `false`,則子物件將直接複製而不會被複製。這是 2.x 版本之前的預設行為。/ If `clone` is `false` then child objects will be copied directly instead of being cloned. This was the default behavior before version 2.x.
install
======
```bash
pnpm add deepmerge-plus
yarn add deepmerge-plus
pnpm add deepmerge-plus
```
test
====
執行測試 / Run tests
```bash
pnpm test
```
license
======
MIT