ut2
Version:
一个现代 JavaScript 实用工具库。[点击查看在线文档]。
59 lines (55 loc) • 2.18 kB
JavaScript
;
var isArray = require('./isArray.js');
var isObject = require('./isObject.js');
var isObjectLike = require('./isObjectLike.js');
var isPlainObject = require('./isPlainObject.js');
var native = require('./internals/native.js');
var allKeys = require('./allKeys.js');
function baseMerge(object, source, getKeys, customizer, stack) {
if (stack === void 0) { stack = new WeakMap(); }
var obj = Object(object);
if (!isObject(source) || obj === source) {
return obj;
}
var keys = getKeys(source);
var hasCustomizer = typeof customizer === 'function';
keys.forEach(function (key) {
var srcValue = source[key];
var srcIsObj = isObject(srcValue);
if (srcIsObj && stack.has(srcValue)) {
obj[key] = srcValue;
}
else {
var newValue = hasCustomizer ? customizer(obj[key], srcValue, key, obj, source) : native.nativeUndefined;
if (newValue !== native.nativeUndefined) {
obj[key] = newValue;
}
else {
var objValue = obj[key];
var newObjValue = void 0;
if (srcIsObj) {
stack.set(srcValue, true);
if (isArray(srcValue)) {
newObjValue = isArray(objValue) ? objValue : [];
}
else if (isPlainObject(srcValue)) {
newObjValue = isObjectLike(objValue) ? objValue : {};
}
}
if (newObjValue) {
obj[key] = baseMerge(newObjValue, srcValue, getKeys, customizer, stack);
}
else if (srcValue !== native.nativeUndefined || !(key in obj)) {
obj[key] = srcValue;
}
}
}
});
return obj;
}
function merge(object, source, customizer, getKeys) {
if (getKeys === void 0) { getKeys = allKeys; }
return baseMerge(object, source, getKeys, customizer);
}
merge.NOT_MERGE_ARRAYS = function (objValue, srcValue) { return (isArray(srcValue) ? srcValue : native.nativeUndefined); };
module.exports = merge;