heyujie
2021-06-07 8f8155aa4c83f7c2577ac123add550766b6a7ce3
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
31
32
33
34
"use strict";
 
var includes      = require("../array/#/contains")
  , uniq          = require("../array/#/uniq")
  , copyDeep      = require("./copy-deep")
  , objForEach    = require("./for-each")
  , isPlainObject = require("./is-plain-object")
  , ensureValue   = require("./valid-value");
 
var isArray = Array.isArray, slice = Array.prototype.slice;
 
var deepAssign = function (target, source) {
    if (target === source) return target;
    if (isPlainObject(target) && isPlainObject(source)) {
        objForEach(source, function (value, key) { target[key] = deepAssign(target[key], value); });
        return target;
    }
    if (isArray(target) && isArray(source)) {
        source.forEach(function (item) {
            if (includes.call(target, item)) return;
            if (isArray(item) || isPlainObject(item)) item = copyDeep(item);
            target.push(item);
        });
        return target;
    }
    if (isPlainObject(source) || isArray(source)) return copyDeep(source);
    return source;
};
 
module.exports = function (target/*, ...objects*/) {
    return uniq
        .call([ensureValue(target)].concat(slice.call(arguments, 1).map(ensureValue)))
        .reduce(deepAssign);
};