baseMerge.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. * The base implementation of `_.merge` without support for argument juggling,
  11. * multiple sources, and `this` binding `customizer` functions.
  12. *
  13. * @private
  14. * @param {Object} object The destination object.
  15. * @param {Object} source The source object.
  16. * @param {Function} [customizer] The function to customize merged values.
  17. * @param {Array} [stackA=[]] Tracks traversed source objects.
  18. * @param {Array} [stackB=[]] Associates values with source counterparts.
  19. * @returns {Object} Returns `object`.
  20. */
  21. function baseMerge(object, source, customizer, stackA, stackB) {
  22. if (!isObject(object)) {
  23. return object;
  24. }
  25. var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
  26. props = isSrcArr ? undefined : keys(source);
  27. arrayEach(props || source, function(srcValue, key) {
  28. if (props) {
  29. key = srcValue;
  30. srcValue = source[key];
  31. }
  32. if (isObjectLike(srcValue)) {
  33. stackA || (stackA = []);
  34. stackB || (stackB = []);
  35. baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
  36. }
  37. else {
  38. var value = object[key],
  39. result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
  40. isCommon = result === undefined;
  41. if (isCommon) {
  42. result = srcValue;
  43. }
  44. if ((result !== undefined || (isSrcArr && !(key in object))) &&
  45. (isCommon || (result === result ? (result !== value) : (value === value)))) {
  46. object[key] = result;
  47. }
  48. }
  49. });
  50. return object;
  51. }
  52. module.exports = baseMerge;