源码学习——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源码的风格,也能学习到数组循环,参数判断具体写法。

相关推荐
LCG元6 小时前
STM32实战:基于STM32F103的Bootloader设计与IAP在线升级
javascript·stm32·嵌入式硬件
超级无敌暴龙兽8 小时前
和我一起刷面试题呀
前端·面试
wzl202612138 小时前
企业微信定时群发技术实现与实操指南(原生接口+工具落地)
java·运维·前端·企业微信
小码哥_常8 小时前
Robots.txt:互联网爬虫世界的“隐形规则”
前端
小码哥_常8 小时前
Android开发神器:AndroidAutoSize,轻松搞定屏幕适配
前端
前端一小卒8 小时前
前端工程师的全栈焦虑,我用 60 天治好了
前端·javascript·后端
不停喝水8 小时前
【AI+Cursor】 告别切图仔,拥抱Vibe Coding: AI + Cursor 开启多模态全栈新纪元 (1)
前端·人工智能·后端·ai·ai编程·cursor
coderyi10 小时前
LLM Agent 浅析
前端·javascript·人工智能
我叫黑大帅10 小时前
TypeScript 6.0 弃用选项错误 TS5101 解决方法
javascript·后端·面试