源码学习——lodash(一)

前言

lodash库想必大家都不陌生,它封装了多个数据处理方法,极大方便了我们的开发,但是我们可能就只熟悉几种方法,其他方法也没有专门去了解。当我们费劲写出方法去处理数据,lodash或许就有类似的方法,为了提高日常开发效率,我们就来学习一下lodash各个方法的源码。

chunk

我们就根据lodash文档的顺序来看一下各个方法的源码,首先就是数组的chunk方法。

  • 用法:将数组拆分 成每份长度为n的数组,返回这些数组的集合,也就是二维数组。最后剩余长度不够n时,依旧返回,该方法的语法为:
js 复制代码
  _.chunk(array,size) 
  array为数组
  size为长度 默认为1
  _.chunk([1, 2, 3], 2); // [[1,2],[3]]

我们可以先思考一下,自己能否写一个类似的方法呢?下面我们就看下lodash的实现。

  1. 参数结果判断:首先判断size参数,确保size最终为正整数。toInteger 为lodash语言方法的一种,这里就是将size变成整数,再用Math.max与0做对比,确保为正整数。 接着判断结果,不满足拆分直接返回空数组。
  2. 根据size、length初始化数组,接着用while进行循环拆分,而拆分用了lodash的slice方法,slice三个参数分别为数组,开始下标、结束下标,效果跟原生slice方法一样。这里需要注意第三个参数index += size 表达式,实参是表达式的值,而index也因为表达式进行了赋值,这个保证了循环的进行,最终当下标大于数组长度,循环结束,得到拆分数组。
    chunk源码看起来简单,但是涉及自身的方法就有两种,我们后续将方法扩展出来,内容就多了,该方法比较巧妙的一点就是第三个参数运用表达式。

compact

compact用来过滤数组元素中的假值 ,返回过滤后的数组。具体的假值为undefined、null、0、''、false、NaN,这些都是if判断不通过的值,NaN也是判断为false的值。

js 复制代码
   _.compact(array)
   _.compact([false,1])//[1]

这个思路就很明确,循环数组用if判断就行,lodash源码就是如此写法。

  1. 判断参数,为null,返回空数组。
  2. 用for of循环数组元素,进行if判断,为true添加到结果数组中。这里添加元素方法跟chunk一样,都是通过下标添加的,以此推论,lodash数组元素添加可能都是通过循环实现。

concat

数组元素方法中也有concat方法,用于连接多个数组,该方法是升级版,它能够将数组与任何值连接到一起,返回连接后的新数组。

js 复制代码
   concat(array,...value)
   //value是需要连接的值,可以任意拼接
   _.concat([1],[3]) //[1,3]

查阅源码,我们会发现lodash的master没有concat.ts文件,issues也提到了相关问题,lodash.js文件里还是有该方法的,那么我们就查看lodash.js文件,简单了解下实现逻辑,这里我们查看4.17.21的lodash.js。

  1. 参数判断,通过arguments长度进行非空判断,并且将array与other分开,用while或者other,lodash都是尽量避免使用原生Array方法,而是用循环等进行数据处理。
  2. 利用arrayPush完成连接,第一个参数会判断array运用三目运算确保实参为数组,第二个参数利用baseFlatten将剩余参数进行扁平化处理。查看一个arrayPush方法:

逻辑还是很清晰的,就是将第二个数组元素添加到第一个数组当中。

总结

以上就是lodash三个数组方法的源码解析,从这三个方法我们就能简单了解到lodash源码的风格,也能学习到数组循环,参数判断具体写法。

相关推荐
羲云14 分钟前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师27 分钟前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李35 分钟前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
羲云35 分钟前
别让 AI 凭记忆做调研:给 WorkBuddy 接上可核验的实时搜索
前端
只睡四小时42 分钟前
AI 生成 PPTX:11 页课件编译出 429 个形状
javascript·python·pptx·ai生成ppt·ooxml
deli0071 小时前
连接池到底配多大?QPS 和 RT 算一遍,再跑 1 万次请求实测超时率
前端
风花一世月1 小时前
🏮 我把三坊七巷做成了能飞的 3D 地图(901 个真实建筑轮廓、20 处景点,在线直接玩)
前端
特立独行的猫A1 小时前
用仓颉语言写一个串口调试助手:cj-tauri 实战
前端
小凯在掘金1 小时前
Shadow DOM 和 Virtual DOM ?别再傻傻分不清
前端·html
郑州光合科技余经理1 小时前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程