1 var arrayEach = require('./arrayEach'),
2 baseMergeDeep = require('./baseMergeDeep'),
3 isArray = require('../lang/isArray'),
4 isArrayLike = require('./isArrayLike'),
5 isObject = require('../lang/isObject'),
6 isObjectLike = require('./isObjectLike'),
7 isTypedArray = require('../lang/isTypedArray'),
8 keys = require('../object/keys');
11 * The base implementation of `_.merge` without support for argument juggling,
12 * multiple sources, and `this` binding `customizer` functions.
15 * @param {Object} object The destination object.
16 * @param {Object} source The source object.
17 * @param {Function} [customizer] The function to customize merged values.
18 * @param {Array} [stackA=[]] Tracks traversed source objects.
19 * @param {Array} [stackB=[]] Associates values with source counterparts.
20 * @returns {Object} Returns `object`.
22 function baseMerge(object, source, customizer, stackA, stackB) {
23 if (!isObject(object)) {
26 var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
27 props = isSrcArr ? undefined : keys(source);
29 arrayEach(props || source, function(srcValue, key) {
32 srcValue = source[key];
34 if (isObjectLike(srcValue)) {
35 stackA || (stackA = []);
36 stackB || (stackB = []);
37 baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
40 var value = object[key],
41 result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
42 isCommon = result === undefined;
47 if ((result !== undefined || (isSrcArr && !(key in object))) &&
48 (isCommon || (result === result ? (result !== value) : (value === value)))) {
56 module.exports = baseMerge;