UNPKG

ut2

Version:

一个现代 JavaScript 实用工具库。[点击查看在线文档]。

59 lines (55 loc) 2.18 kB
'use strict'; 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;