Lodash源码阅读-uniq

Lodash 源码阅读-uniq

概述

uniq 函数用于创建一个数组的去重版本,只保留数组中每个元素的第一次出现。这个函数使用 SameValueZero 进行相等性比较,结果数组中元素的顺序取决于它们在原数组中首次出现的位置。

前置学习

函数依赖:

  • baseUniq: 不支持迭代器简写形式的 uniq 函数的基本实现。

技术知识:

  • JavaScript 的类型转换
  • JavaScript 中的相等性比较(SameValueZero
  • 数组去重算法
  • 哈希表的使用

源码实现

js 复制代码
function uniq(array) {
  return array && array.length ? baseUniq(array) : [];
}

实现思路

uniq 函数的实现非常简洁,主要逻辑委托给了 baseUniq 函数。首先进行了参数验证:检查 array 是否存在且有长度,如果是则调用 baseUniq 处理数组去重,否则返回空数组。而真正的去重逻辑在 baseUniq 函数中实现。

源码解析

让我们逐行解析 uniq 函数:

js 复制代码
function uniq(array) {

函数定义,接收一个参数 array,这是需要去重的数组。

js 复制代码
return array && array.length ? baseUniq(array) : [];

这行代码做了两件事:

  1. 检查 array 是否存在且有长度(array && array.length
  2. 根据检查结果:
    • 如果 array 存在且有长度,则调用 baseUniq(array) 执行去重操作
    • 如果 array 不存在或长度为 0,则直接返回空数组 []

这样的处理方式确保了函数的健壮性,避免了对无效输入的处理。

uniq 函数的核心去重逻辑委托给了内部函数 baseUniq。当 uniq 调用 baseUniq(array) 时,它仅传递了原数组作为参数,没有提供 iterateecomparator 参数。

在这种调用模式下,baseUniq 的核心任务是实现基于 SameValueZero 相等性比较的数组去重,并会根据数组的大小(length >= LARGE_ARRAY_SIZE)选择不同的性能优化策略(如使用 SetSetCache 或直接遍历比较)。虽然 baseUniq 内部有处理 iterateecomparator 的逻辑分支,但对于 uniq 的直接调用,这些分支不会被激活。

总而言之,uniq 依赖 baseUniq 来完成实际的去重工作,通过提供简化的 API 接口使开发者能够方便地进行数组去重操作。这种设计让 uniq 能够保持简洁的接口,同时在内部利用功能更强大的 baseUniq 实现高效的去重处理。

总结

uniq 函数是 Lodash 提供的一个简单易用但功能强大的数组去重工具。它的特点包括:

  1. 简单的 API 设计:只需传入一个数组参数即可使用
  2. 健壮的参数处理 :能够处理各种边缘情况,如空数组、nullundefined
  3. 高效的实现:针对大数组提供了优化
  4. 正确的语义 :使用 SameValueZero 进行相等性比较,正确处理特殊值如 NaN-0

在实际开发中,uniq 函数可以用于去除数组中的重复元素,简化数据处理流程,是数组操作中常用的工具函数。

从设计模式角度看,uniq 采用了委托模式,将具体实现委托给 baseUniq 函数,这种设计使得 API 保持简洁的同时,内部实现可以更加灵活和高效。

相关推荐
Pu_Nine_912 分钟前
10 分钟上手 ECharts:从“能跑”到“生产级”的完整踩坑之旅
前端·javascript·echarts·css3·html5
東雪蓮☆1 小时前
从零开始掌握 Web 与 Nginx:入门详解
运维·服务器·前端·nginx
脑子慢且灵1 小时前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
柯南二号1 小时前
【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
前端
前端小超超1 小时前
如何配置capacitor 打包的安卓app固定竖屏展示?
android·前端·gitee
xiaopengbc1 小时前
在Webpack中,如何在不同环境中使用不同的API地址?
前端·webpack·node.js
前端AK君2 小时前
React中台系统如何嵌入到业务系统中
前端
Slice_cy2 小时前
不定高虚拟列表
前端
前端AK君2 小时前
React组件库如何在vue项目中使用
前端
Moonbit2 小时前
MoonBit 再次走进清华:张宏波受邀参加「思源计划」与「程序设计训练课」
前端·后端·编程语言