_.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