var getRawType = function getRawType(val) { return Object.prototype.toString.call(val).slice(8, -1); }; var isPlainObjectOrArray = function isPlainObjectOrArray(val) { return isPlainObject(val) || Array.isArray(val); }; var isPlainObject = function isPlainObject(val) { return getRawType(val) === 'Object'; }; export var merge = function merge(object) { for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { sources[_key - 1] = arguments[_key]; } for (var _i = 0, _sources = sources; _i < _sources.length; _i++) { var source = _sources[_i]; for (var key in source) { if (source[key] === undefined && key in object) { continue; } if (isPlainObjectOrArray(source[key])) { if (getRawType(object[key] === getRawType(source[key]))) { if (isPlainObject(object[key])) { merge(object[key], source[key]); } else { object[key] = object[key].concat(source[key]); } } else { object[key] = source[key]; } } else { object[key] = source[key]; } } } return object; };