Spaces:
Runtime error
Runtime error
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; | |