_baseMerge.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import Stack from './_Stack';
  2. import arrayEach from './_arrayEach';
  3. import assignMergeValue from './_assignMergeValue';
  4. import baseMergeDeep from './_baseMergeDeep';
  5. import isArray from './isArray';
  6. import isObject from './isObject';
  7. import isTypedArray from './isTypedArray';
  8. import keysIn from './keysIn';
  9. /**
  10. * The base implementation of `_.merge` without support for multiple sources.
  11. *
  12. * @private
  13. * @param {Object} object The destination object.
  14. * @param {Object} source The source object.
  15. * @param {number} srcIndex The index of `source`.
  16. * @param {Function} [customizer] The function to customize merged values.
  17. * @param {Object} [stack] Tracks traversed source values and their merged
  18. * counterparts.
  19. */
  20. function baseMerge(object, source, srcIndex, customizer, stack) {
  21. if (object === source) {
  22. return;
  23. }
  24. if (!(isArray(source) || isTypedArray(source))) {
  25. var props = keysIn(source);
  26. }
  27. arrayEach(props || source, function(srcValue, key) {
  28. if (props) {
  29. key = srcValue;
  30. srcValue = source[key];
  31. }
  32. if (isObject(srcValue)) {
  33. stack || (stack = new Stack);
  34. baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
  35. }
  36. else {
  37. var newValue = customizer
  38. ? customizer(object[key], srcValue, (key + ''), object, source, stack)
  39. : undefined;
  40. if (newValue === undefined) {
  41. newValue = srcValue;
  42. }
  43. assignMergeValue(object, key, newValue);
  44. }
  45. });
  46. }
  47. export default baseMerge;