/ cloudformation-templates / node_modules / lodash / _baseIsEqualDeep.js
_baseIsEqualDeep.js
 1  var Stack = require('./_Stack'),
 2      equalArrays = require('./_equalArrays'),
 3      equalByTag = require('./_equalByTag'),
 4      equalObjects = require('./_equalObjects'),
 5      getTag = require('./_getTag'),
 6      isArray = require('./isArray'),
 7      isBuffer = require('./isBuffer'),
 8      isTypedArray = require('./isTypedArray');
 9  
10  /** Used to compose bitmasks for value comparisons. */
11  var COMPARE_PARTIAL_FLAG = 1;
12  
13  /** `Object#toString` result references. */
14  var argsTag = '[object Arguments]',
15      arrayTag = '[object Array]',
16      objectTag = '[object Object]';
17  
18  /** Used for built-in method references. */
19  var objectProto = Object.prototype;
20  
21  /** Used to check objects for own properties. */
22  var hasOwnProperty = objectProto.hasOwnProperty;
23  
24  /**
25   * A specialized version of `baseIsEqual` for arrays and objects which performs
26   * deep comparisons and tracks traversed objects enabling objects with circular
27   * references to be compared.
28   *
29   * @private
30   * @param {Object} object The object to compare.
31   * @param {Object} other The other object to compare.
32   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
33   * @param {Function} customizer The function to customize comparisons.
34   * @param {Function} equalFunc The function to determine equivalents of values.
35   * @param {Object} [stack] Tracks traversed `object` and `other` objects.
36   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
37   */
38  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
39    var objIsArr = isArray(object),
40        othIsArr = isArray(other),
41        objTag = objIsArr ? arrayTag : getTag(object),
42        othTag = othIsArr ? arrayTag : getTag(other);
43  
44    objTag = objTag == argsTag ? objectTag : objTag;
45    othTag = othTag == argsTag ? objectTag : othTag;
46  
47    var objIsObj = objTag == objectTag,
48        othIsObj = othTag == objectTag,
49        isSameTag = objTag == othTag;
50  
51    if (isSameTag && isBuffer(object)) {
52      if (!isBuffer(other)) {
53        return false;
54      }
55      objIsArr = true;
56      objIsObj = false;
57    }
58    if (isSameTag && !objIsObj) {
59      stack || (stack = new Stack);
60      return (objIsArr || isTypedArray(object))
61        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
62        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
63    }
64    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
65      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
66          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
67  
68      if (objIsWrapped || othIsWrapped) {
69        var objUnwrapped = objIsWrapped ? object.value() : object,
70            othUnwrapped = othIsWrapped ? other.value() : other;
71  
72        stack || (stack = new Stack);
73        return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
74      }
75    }
76    if (!isSameTag) {
77      return false;
78    }
79    stack || (stack = new Stack);
80    return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
81  }
82  
83  module.exports = baseIsEqualDeep;