Lodash 源码阅读-sortedUniq
概述
sortedUniq
是 Lodash 库中的一个数组方法,用于创建一个新的去重数组,专门针对已排序的数组进行优化。它的功能类似于 uniq
,但由于假设输入数组已经排序,因此能够更高效地去除重复元素。
前置学习
依赖函数
baseSortedUniq
:内部基础函数,实现针对排序数组的去重逻辑eq
:内部函数,用于比较两个值是否相等
技术知识
- JavaScript 数组操作
- 排序数组的特性利用
- 相等性比较
源码实现
javascript
function sortedUniq(array) {
return array && array.length ? baseSortedUniq(array) : [];
}
实现思路
sortedUniq
的实现非常简洁,主要分为两个步骤:
- 检查输入数组是否存在且有长度
- 如果条件满足,则调用
baseSortedUniq
执行实际的去重逻辑;否则返回空数组
核心去重算法在 baseSortedUniq
中实现,该函数利用排序数组的特性(相同元素必然相邻)来提高去重效率。
源码解析
函数签名和参数检查
javascript
function sortedUniq(array) {
return array && array.length ? baseSortedUniq(array) : [];
}
- 函数接收一个参数
array
:要去重的已排序数组 - 首先检查
array && array.length
:确保输入是有效数组且不为空- 如果数组无效或为空,直接返回空数组
[]
- 如果数组有效,则调用
baseSortedUniq(array)
进行去重处理
- 如果数组无效或为空,直接返回空数组
baseSortedUniq 工作原理
baseSortedUniq
函数通过一次遍历实现去重,主要利用排序数组的一个关键特性:相同的元素在排序后必然相邻。因此,只需要将当前元素与前一个元素比较,如果不相同则加入结果数组。
这种方法比通用的 uniq
更高效,因为它只需要 O(n) 的时间复杂度,而不需要使用哈希表或者多次比较。
总结
sortedUniq
是一个针对已排序数组优化的去重函数,相比通用的 uniq
函数具有更好的性能。其实现利用了排序数组中相同元素相邻的特性,只需一次线性遍历即可完成去重。
设计特点
- 专用性设计:针对特定场景(已排序数组)提供了性能优化版本
- 简单接口 :保持与
uniq
相似的接口,便于使用 - 空值处理:妥善处理了无效输入和边界情况
- 特殊值处理 :正确处理了 JavaScript 中的特殊值(如
0
和-0
)
这种设计体现了 Lodash 库的一个重要思想:为常见场景提供专门优化的函数版本,在保持 API 一致性的同时提升性能。