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