Blame view

node_modules/es5-ext/object/assign-deep.js 1.09 KB
aaac7fed   liuqimichale   add
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);
  };