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
			| 
								 
											4 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;
							 |