You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					85 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					85 lines
				
				2.6 KiB
			| 
											3 years ago
										 | var SetCache = require('./_SetCache'), | ||
|  |     arraySome = require('./_arraySome'), | ||
|  |     cacheHas = require('./_cacheHas'); | ||
|  | 
 | ||
|  | /** Used to compose bitmasks for value comparisons. */ | ||
|  | var COMPARE_PARTIAL_FLAG = 1, | ||
|  |     COMPARE_UNORDERED_FLAG = 2; | ||
|  | 
 | ||
|  | /** | ||
|  |  * A specialized version of `baseIsEqualDeep` for arrays with support for | ||
|  |  * partial deep comparisons. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @param {Array} array The array to compare. | ||
|  |  * @param {Array} other The other array 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 `array` and `other` objects. | ||
|  |  * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. | ||
|  |  */ | ||
|  | function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { | ||
|  |   var isPartial = bitmask & COMPARE_PARTIAL_FLAG, | ||
|  |       arrLength = array.length, | ||
|  |       othLength = other.length; | ||
|  | 
 | ||
|  |   if (arrLength != othLength && !(isPartial && othLength > arrLength)) { | ||
|  |     return false; | ||
|  |   } | ||
|  |   // Check that cyclic values are equal.
 | ||
|  |   var arrStacked = stack.get(array); | ||
|  |   var othStacked = stack.get(other); | ||
|  |   if (arrStacked && othStacked) { | ||
|  |     return arrStacked == other && othStacked == array; | ||
|  |   } | ||
|  |   var index = -1, | ||
|  |       result = true, | ||
|  |       seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; | ||
|  | 
 | ||
|  |   stack.set(array, other); | ||
|  |   stack.set(other, array); | ||
|  | 
 | ||
|  |   // Ignore non-index properties.
 | ||
|  |   while (++index < arrLength) { | ||
|  |     var arrValue = array[index], | ||
|  |         othValue = other[index]; | ||
|  | 
 | ||
|  |     if (customizer) { | ||
|  |       var compared = isPartial | ||
|  |         ? customizer(othValue, arrValue, index, other, array, stack) | ||
|  |         : customizer(arrValue, othValue, index, array, other, stack); | ||
|  |     } | ||
|  |     if (compared !== undefined) { | ||
|  |       if (compared) { | ||
|  |         continue; | ||
|  |       } | ||
|  |       result = false; | ||
|  |       break; | ||
|  |     } | ||
|  |     // Recursively compare arrays (susceptible to call stack limits).
 | ||
|  |     if (seen) { | ||
|  |       if (!arraySome(other, function(othValue, othIndex) { | ||
|  |             if (!cacheHas(seen, othIndex) && | ||
|  |                 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { | ||
|  |               return seen.push(othIndex); | ||
|  |             } | ||
|  |           })) { | ||
|  |         result = false; | ||
|  |         break; | ||
|  |       } | ||
|  |     } else if (!( | ||
|  |           arrValue === othValue || | ||
|  |             equalFunc(arrValue, othValue, bitmask, customizer, stack) | ||
|  |         )) { | ||
|  |       result = false; | ||
|  |       break; | ||
|  |     } | ||
|  |   } | ||
|  |   stack['delete'](array); | ||
|  |   stack['delete'](other); | ||
|  |   return result; | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = equalArrays; |