Initial commit
[yaffs-website] / node_modules / grunt-contrib-watch / node_modules / lodash / internal / baseMerge.js
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');
9
10 /**
11  * The base implementation of `_.merge` without support for argument juggling,
12  * multiple sources, and `this` binding `customizer` functions.
13  *
14  * @private
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`.
21  */
22 function baseMerge(object, source, customizer, stackA, stackB) {
23   if (!isObject(object)) {
24     return object;
25   }
26   var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
27       props = isSrcArr ? undefined : keys(source);
28
29   arrayEach(props || source, function(srcValue, key) {
30     if (props) {
31       key = srcValue;
32       srcValue = source[key];
33     }
34     if (isObjectLike(srcValue)) {
35       stackA || (stackA = []);
36       stackB || (stackB = []);
37       baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
38     }
39     else {
40       var value = object[key],
41           result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
42           isCommon = result === undefined;
43
44       if (isCommon) {
45         result = srcValue;
46       }
47       if ((result !== undefined || (isSrcArr && !(key in object))) &&
48           (isCommon || (result === result ? (result !== value) : (value === value)))) {
49         object[key] = result;
50       }
51     }
52   });
53   return object;
54 }
55
56 module.exports = baseMerge;