You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.2 KiB
59 lines
1.2 KiB
/*! |
|
* merge-deep <https://github.com/jonschlinkert/merge-deep> |
|
* |
|
* Copyright (c) 2014-2015, Jon Schlinkert. |
|
* Licensed under the MIT License. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
var union = require('arr-union'); |
|
var clone = require('clone-deep'); |
|
var typeOf = require('kind-of'); |
|
|
|
module.exports = function mergeDeep(orig, objects) { |
|
if (!isObject(orig) && !Array.isArray(orig)) { |
|
orig = {}; |
|
} |
|
|
|
var target = clone(orig); |
|
var len = arguments.length; |
|
var idx = 0; |
|
|
|
while (++idx < len) { |
|
var val = arguments[idx]; |
|
|
|
if (isObject(val) || Array.isArray(val)) { |
|
merge(target, val); |
|
} |
|
} |
|
return target; |
|
}; |
|
|
|
function merge(target, obj) { |
|
for (var key in obj) { |
|
if (key === '__proto__' || !hasOwn(obj, key)) { |
|
continue; |
|
} |
|
|
|
var oldVal = obj[key]; |
|
var newVal = target[key]; |
|
|
|
if (isObject(newVal) && isObject(oldVal)) { |
|
target[key] = merge(newVal, oldVal); |
|
} else if (Array.isArray(newVal)) { |
|
target[key] = union([], newVal, oldVal); |
|
} else { |
|
target[key] = clone(oldVal); |
|
} |
|
} |
|
return target; |
|
} |
|
|
|
function hasOwn(obj, key) { |
|
return Object.prototype.hasOwnProperty.call(obj, key); |
|
} |
|
|
|
function isObject(val) { |
|
return typeOf(val) === 'object' || typeOf(val) === 'function'; |
|
}
|
|
|