_.sortedUniqBy(array, [iteratee])

43

_.sortedUniqBy(array, [iteratee])
_.sortedUniqBy与uniqBy类似,多传入一个遍历器参数处理每一个元素
创建一个数组的副本,使用SameValueZero规则来比较是否相等,只保留每一个元素第一次出现的值,也就是去重。结果的次序取决于原数组中的次序。
这个方法只适用于已经排好序的数组
参数

array (Array): 需要去重的已排好序的数组

[iteratee] (Function): 遍历器会处理每一个数组元素

返回值

(Array):返回去重后的数组副本

例子

_.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
// => [1.1, 2.3]

源代码:

import baseSortedUniq from './.internal/baseSortedUniq.js'

/**
 * This method is like `uniqBy` except that it's designed and optimized
 * for sorted arrays.
 *
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} iteratee The iteratee invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor)
 * // => [1.1, 2.3]
 */
//与uniqBy类似,多传入一个遍历器参数处理每一个元素
//这个方法只适用于已经排好序的数组
function sortedUniqBy(array, iteratee) {
  return (array != null && array.length)
    ? baseSortedUniq(array, iteratee)
    : []
    //如果数组不为空且有长度,调用baseSortedUniq处理
    //否则返回空数组
}

export default sortedUniqBy

baseSortedUniq

import eq from '../eq.js'

/**
 * The base implementation of `sortedUniq` and `sortedUniqBy`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 */
//sortedUniq和sortedUniqBy的基础实现
function baseSortedUniq(array, iteratee) {
  let seen
  let index = -1//循环索引
  let resIndex = 0//结果数组索引

  const { length } = array//数组长度
  const result = []//结果数组

  while (++index < length) {
    const value = array[index], computed = iteratee ? iteratee(value) : value
    //value是原数组的当前值,computed是遍历器处理后的当前值
    if (!index || !eq(computed, seen)) {//如果是第一个元素或者,与之前的元素不相等
      seen = computed//存下新出现的元素,然后给结果数组里赋值
      result[resIndex++] = value === 0 ? 0 : value
      //结果数组结尾插入新值,排除-0的影响
    }
  }
  return result
}

export default baseSortedUniq

 

posted @ 2018-10-19 14:26  hahazexia  阅读(845)  评论(0)    收藏  举报