# 深度合并

import mergeDeep from '@sadais/piui-tool/tools/mergeDeep'
// or
this.$pi.mergeDeep(obj1, obj2)
1
2
3

# mergeDeep(target, source, options) ⇒ Object

深度合并对象,支持数组 可使用 .all 合并多个对象,此时第一个参数必须为数组

Kind: global function
Returns: Object - 合并后的对象

Param Type
target *
source *
options *

Example

const foobar = { foo: { bar: 3 } }
const foobaz = { foo: { baz: 4 } }
const bar = { bar: 'yay!' }
merge.all([ foobar, foobaz, bar ]) // => { foo: { bar: 3, baz: 4 }, bar: 'yay!' }
1
2
3
4

Example
options 接收一个对象,对象属性有: arrayMerge , isMergeableObject , customMerge

1、arrayMerge : 合并两个数组,此时前两个入参须为数组。 overwriteMerge 表示完全覆写,用source覆盖target, combineMerge 表示会合并两个数组中相同索引的对象。

merge(
[1, 2, 3],
[3, 2, 1],
{ arrayMerge: overwriteMerge }
) // => [3, 2, 1]
merge(
[{ a: true }],
[{ b: true }, 'ah yup'],
{ arrayMerge: combineMerge }
)
1
2
3
4
5
6
7
8
9
10

2、isMergeableObject : 如果您只想克隆普通对象的属性,而忽略所有“特殊”类型的实例化对象,这是你可能就需要 is-plain-object 了。

const isPlainObject = require('is-plain-object')

function SuperSpecial() {
this.special = 'oh yeah man totally'
}

const instantiatedSpecialObject = new SuperSpecial()

const target = {
 someProperty: {
   cool: 'oh for sure'
 }
}

const source = {
 someProperty: instantiatedSpecialObject
}

const customMergeOutput = merge(target, source, {
   isMergeableObject: isPlainObject
})

customMergeOutput.someProperty.cool // => undefined
customMergeOutput.someProperty.special // => 'oh yeah man totally'
customMergeOutput.someProperty instanceof SuperSpecial // => true
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

3、 customMerge : 指定一个函数,该函数可用于根据属性名称覆盖默认合并行为。 customMerge 函数将传递每个属性的键名,并返回用于合并该属性value值的函数。它也可能返回 undefined,在这种情况下将使用默认合并行为。

const alex = {
    name: {
        first: 'Alex',
        last: 'Alexson'
    },
    pets: ['Cat', 'Parrot']
}

const tony = {
    name: {
        first: 'Tony',
        last: 'Tonison'
    },
    pets: ['Dog']
}

const mergeNames = (nameA, nameB) => `${nameA.first} and ${nameB.first}`

const options = {
    customMerge: (key) => {
        if (key === 'name') {
            return mergeNames
        }
    }
}

const result = merge(alex, tony, options)

result.name // => 'Alex and Tony'
result.pets // => ['Cat', 'Parrot', 'Dog']
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

Last updated: 2021/9/3 上午11:33:23