mirror of
https://github.com/atlanticbiomedical/biomedjs.git
synced 2025-07-02 00:47:26 -04:00
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
![]() |
var arrayEach = require('./arrayEach'),
|
||
|
baseMergeDeep = require('./baseMergeDeep'),
|
||
|
getSymbols = require('./getSymbols'),
|
||
|
isArray = require('../lang/isArray'),
|
||
|
isLength = require('./isLength'),
|
||
|
isObject = require('../lang/isObject'),
|
||
|
isObjectLike = require('./isObjectLike'),
|
||
|
isTypedArray = require('../lang/isTypedArray'),
|
||
|
keys = require('../object/keys');
|
||
|
|
||
|
/** Used for native method references. */
|
||
|
var arrayProto = Array.prototype;
|
||
|
|
||
|
/** Native method references. */
|
||
|
var push = arrayProto.push;
|
||
|
|
||
|
/**
|
||
|
* The base implementation of `_.merge` without support for argument juggling,
|
||
|
* multiple sources, and `this` binding `customizer` functions.
|
||
|
*
|
||
|
* @private
|
||
|
* @param {Object} object The destination object.
|
||
|
* @param {Object} source The source object.
|
||
|
* @param {Function} [customizer] The function to customize merging properties.
|
||
|
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||
|
* @param {Array} [stackB=[]] Associates values with source counterparts.
|
||
|
* @returns {Object} Returns `object`.
|
||
|
*/
|
||
|
function baseMerge(object, source, customizer, stackA, stackB) {
|
||
|
if (!isObject(object)) {
|
||
|
return object;
|
||
|
}
|
||
|
var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
|
||
|
if (!isSrcArr) {
|
||
|
var props = keys(source);
|
||
|
push.apply(props, getSymbols(source));
|
||
|
}
|
||
|
arrayEach(props || source, function(srcValue, key) {
|
||
|
if (props) {
|
||
|
key = srcValue;
|
||
|
srcValue = source[key];
|
||
|
}
|
||
|
if (isObjectLike(srcValue)) {
|
||
|
stackA || (stackA = []);
|
||
|
stackB || (stackB = []);
|
||
|
baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
|
||
|
}
|
||
|
else {
|
||
|
var value = object[key],
|
||
|
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||
|
isCommon = result === undefined;
|
||
|
|
||
|
if (isCommon) {
|
||
|
result = srcValue;
|
||
|
}
|
||
|
if ((isSrcArr || result !== undefined) &&
|
||
|
(isCommon || (result === result ? (result !== value) : (value === value)))) {
|
||
|
object[key] = result;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
return object;
|
||
|
}
|
||
|
|
||
|
module.exports = baseMerge;
|