deepmerge2
Version:
A library for deep (recursive) merging of Javascript objects
68 lines (61 loc) • 1.73 kB
JavaScript
(function(root, factory) {
if(typeof define === 'function' && define.amd) {
define(factory);
} else if(typeof exports === 'object') {
module.exports = factory();
} else {
root.deepmerge = factory();
}
}(this, function() {
function deepmerge(target, src) {
var array = Array.isArray(src);
var dst = array && [] || {};
if(array) {
target = target || [];
dst = dst.concat(target);
src.forEach(function(e, i) {
if(typeof dst[i] === 'undefined') {
dst[i] = e;
} else if(typeof e === 'object' && e !== null) {
dst[i] = deepmerge(target[i], e);
} else {
if(target.indexOf(e) === -1) {
dst.push(e);
}
}
});
} else {
if(target && typeof target === 'object') {
Object.keys(target).forEach(function(key) {
dst[key] = target[key];
})
}
Object.keys(src).forEach(function(key) {
switch(true) {
case typeof src[key] !== 'object':
case !src[key]:
case src[key] instanceof Date:
case src[key] instanceof RegExp: {
dst[key] = src[key];
break;
}
default: {
if(!target[key]) {
dst[key] = src[key];
} else {
dst[key] = deepmerge(target[key], src[key]);
}
}
}
});
}
return dst;
}
return function deepMergeWrapper(target) {
var result = target;
Array.prototype.slice.call(arguments, 1).forEach(function(elem) {
result = deepmerge(result, elem);
});
return result;
}
}));