创建一个去重后的数组副本

/**
 * 创建一个去重后的array数组副本,使用了全等比较,只有第一次出现的元素才会被保留
 * Creates a duplicate-free version of an array, in which only the first occurrence of each element
 * is kept. The order of result values is determined by the order they occur in the array
 *
 * @param {Array} array The array to inspect
 * @returns {Array} Returns the new duplicate free array
 * @example
 * uniq([2, 1, 2, NaN, NaN])
 * // => [2, 1, NaN]
 */

import arrayIncludes from "./arrayIncludes"

function baseUniq(array) {
  var index = -1,
    length = array.length,
    result = []

  outer: while (++index < length) {
    var value = array[index]

    //处理可能为NaN的情况
    if (value === value) {
      var resultIndex = result.length
      while (resultIndex--) {
        if (result[resultIndex] === value) {
          continue outer
        }
      }
      result.push(value)
    } else if (!arrayIncludes(result, value)) {
      result.push(value)
    }
  }

  return result
}

function uniq(array) {
  return array && array.length ? baseUniq(array) : []
}

// es6
// function uniq(array) {
//   return array && array.length ? new Set(array) : []
// }

export default uniq
/**
 * 判断数组中是否包含value元素
 * @param {Array} [array] The array to inspect
 * @param {*} target The value to search for
 * @returns {boolean} Returns `true` if `target` is found, else `false`
 */

// indexOf方法
function strictIndexOf(array, value, fromIndex) {
  var index = fromIndex - 1,
    length = array.length

  while (++index < length) {
    if (array[index] === value) {
      return index
    }
  }
  return -1
}

// 匹配NaN的indexOf方法
function baseFindIndex(array, predicate, fromIndex, fromRight) {
  var length = array.length,
    index = fromIndex + (fromRight ? 1 : -1)

  while (fromRight ? index-- : ++index < length) {
    if (predicate(array[index], index, array)) {
      return index
    }
  }
  return -1
}

// 判断是否是NaN元素
function baseIsNaN(value) {
  return value !== value
}

function baseIndexOf(array, value, fromIndex) {
  return value === value
    ? strictIndexOf(array, value, fromIndex)
    : baseFindIndex(array, baseIsNaN, fromIndex)
}

function arrayIncludes(array, value) {
  var length = array == null ? 0 : array.length
  return !!length && baseIndexOf(array, value, 0) > -1
}

export default arrayIncludes

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值