源码学习——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 分钟前
过来人的经验-前端学习路线
前端
CappuccinoRose33 分钟前
React框架学习文档(七)
开发语言·前端·javascript·react.js·前端框架·reactjs·react router
FFF-X43 分钟前
前端字符串模糊匹配实现:精准匹配 + Levenshtein 编辑距离兜底
前端
Hi_kenyon1 小时前
Ref和Reactive都是什么时候使用?
前端·javascript·vue.js
止观止1 小时前
深入理解 interface vs type:终结之争
前端·typescript
css趣多多1 小时前
vue环境变量
前端
RFCEO1 小时前
前端编程 课程十五、:CSS核心基础3:文字+段落样式
前端·css·文字+段落样式·css文本样式·美化页面文本内容·演示动画说明·单行文字垂直居中技
摇滚侠1 小时前
【程序员入门系列】jQuery 零基础入门到精通!Jquery 选择器 API
前端·javascript·jquery
im_AMBER1 小时前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
源力祁老师2 小时前
深入解析 Odoo 中 default_get 方法的功能
java·服务器·前端