| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | var getAllKeys = require('./_getAllKeys');/** Used to compose bitmasks for value comparisons. */var COMPARE_PARTIAL_FLAG = 1;/** Used for built-in method references. */var objectProto = Object.prototype;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * A specialized version of `baseIsEqualDeep` for objects with support for * partial deep comparisons. * * @private * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. * @param {Function} customizer The function to customize comparisons. * @param {Function} equalFunc The function to determine equivalents of values. * @param {Object} stack Tracks traversed `object` and `other` objects. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. */function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,      objProps = getAllKeys(object),      objLength = objProps.length,      othProps = getAllKeys(other),      othLength = othProps.length;  if (objLength != othLength && !isPartial) {    return false;  }  var index = objLength;  while (index--) {    var key = objProps[index];    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {      return false;    }  }  // Check that cyclic values are equal.  var objStacked = stack.get(object);  var othStacked = stack.get(other);  if (objStacked && othStacked) {    return objStacked == other && othStacked == object;  }  var result = true;  stack.set(object, other);  stack.set(other, object);  var skipCtor = isPartial;  while (++index < objLength) {    key = objProps[index];    var objValue = object[key],        othValue = other[key];    if (customizer) {      var compared = isPartial        ? customizer(othValue, objValue, key, other, object, stack)        : customizer(objValue, othValue, key, object, other, stack);    }    // Recursively compare objects (susceptible to call stack limits).    if (!(compared === undefined          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))          : compared        )) {      result = false;      break;    }    skipCtor || (skipCtor = key == 'constructor');  }  if (result && !skipCtor) {    var objCtor = object.constructor,        othCtor = other.constructor;    // Non `Object` object instances with different constructors are not equal.    if (objCtor != othCtor &&        ('constructor' in object && 'constructor' in other) &&        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&          typeof othCtor == 'function' && othCtor instanceof othCtor)) {      result = false;    }  }  stack['delete'](object);  stack['delete'](other);  return result;}module.exports = equalObjects;
 |