63 lines
1.3 KiB
JavaScript
63 lines
1.3 KiB
JavaScript
|
/*!
|
||
|
* 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 (!isValidKey(key) || !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';
|
||
|
}
|
||
|
|
||
|
function isValidKey(key) {
|
||
|
return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';
|
||
|
}
|