# 深度合并
import mergeDeep from '@sadais/piui-tool/tools/mergeDeep'
// or
this.$pi.mergeDeep(obj1, obj2)
1
2
3
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
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
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
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
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