68 lines
2.3 KiB
JavaScript
68 lines
2.3 KiB
JavaScript
|
var keys = require('../object/keys');
|
||
|
|
||
|
/** Used for native 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 {Function} equalFunc The function to determine equivalents of values.
|
||
|
* @param {Function} [customizer] The function to customize comparing values.
|
||
|
* @param {boolean} [isLoose] Specify performing partial comparisons.
|
||
|
* @param {Array} [stackA] Tracks traversed `value` objects.
|
||
|
* @param {Array} [stackB] Tracks traversed `other` objects.
|
||
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||
|
*/
|
||
|
function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
|
||
|
var objProps = keys(object),
|
||
|
objLength = objProps.length,
|
||
|
othProps = keys(other),
|
||
|
othLength = othProps.length;
|
||
|
|
||
|
if (objLength != othLength && !isLoose) {
|
||
|
return false;
|
||
|
}
|
||
|
var index = objLength;
|
||
|
while (index--) {
|
||
|
var key = objProps[index];
|
||
|
if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
var skipCtor = isLoose;
|
||
|
while (++index < objLength) {
|
||
|
key = objProps[index];
|
||
|
var objValue = object[key],
|
||
|
othValue = other[key],
|
||
|
result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
|
||
|
|
||
|
// Recursively compare objects (susceptible to call stack limits).
|
||
|
if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
|
||
|
return false;
|
||
|
}
|
||
|
skipCtor || (skipCtor = key == 'constructor');
|
||
|
}
|
||
|
if (!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)) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
module.exports = equalObjects;
|