50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
var Stack = require('./_Stack'),
|
|
arrayEach = require('./_arrayEach'),
|
|
assignMergeValue = require('./_assignMergeValue'),
|
|
baseKeysIn = require('./_baseKeysIn'),
|
|
baseMergeDeep = require('./_baseMergeDeep'),
|
|
isArray = require('./isArray'),
|
|
isObject = require('./isObject'),
|
|
isTypedArray = require('./isTypedArray');
|
|
|
|
/**
|
|
* The base implementation of `_.merge` without support for multiple sources.
|
|
*
|
|
* @private
|
|
* @param {Object} object The destination object.
|
|
* @param {Object} source The source object.
|
|
* @param {number} srcIndex The index of `source`.
|
|
* @param {Function} [customizer] The function to customize merged values.
|
|
* @param {Object} [stack] Tracks traversed source values and their merged
|
|
* counterparts.
|
|
*/
|
|
function baseMerge(object, source, srcIndex, customizer, stack) {
|
|
if (object === source) {
|
|
return;
|
|
}
|
|
if (!(isArray(source) || isTypedArray(source))) {
|
|
var props = baseKeysIn(source);
|
|
}
|
|
arrayEach(props || source, function(srcValue, key) {
|
|
if (props) {
|
|
key = srcValue;
|
|
srcValue = source[key];
|
|
}
|
|
if (isObject(srcValue)) {
|
|
stack || (stack = new Stack);
|
|
baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
|
|
}
|
|
else {
|
|
var newValue = customizer
|
|
? customizer(object[key], srcValue, (key + ''), object, source, stack)
|
|
: undefined;
|
|
|
|
if (newValue === undefined) {
|
|
newValue = srcValue;
|
|
}
|
|
assignMergeValue(object, key, newValue);
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = baseMerge;
|