1 | "use strict"
|
2 |
|
3 |
|
4 | function isObject(value) {
|
5 |
|
6 |
|
7 | return (!!value && typeof(value) === "object")
|
8 | }
|
9 |
|
10 | function deepMerge(...args) {
|
11 | let target = args[0],
|
12 | len = args.length,
|
13 | i = 0
|
14 |
|
15 | while (++i < len) {
|
16 | let provider = args[i],
|
17 | allKeys = Object.getOwnPropertySymbols(provider).concat(Object.keys(provider)),
|
18 | allKeysLen = allKeys.length,
|
19 | j = -1
|
20 |
|
21 | while (++j < allKeysLen) {
|
22 | let key = allKeys[j],
|
23 | targetVal = target[key],
|
24 | providerVal = provider[key]
|
25 |
|
26 | if (Object.prototype.hasOwnProperty.call(target, key) && isObject(targetVal) && isObject(providerVal)) {
|
27 | deepMerge(targetVal, providerVal)
|
28 | } else {
|
29 | target[key] = providerVal
|
30 | }
|
31 | }
|
32 | }
|
33 |
|
34 | return target
|
35 | }
|
36 |
|
37 | module.exports = deepMerge
|