前言
lodash库想必大家都不陌生,它封装了多个数据处理方法,极大方便了我们的开发,但是我们可能就只熟悉几种方法,其他方法也没有专门去了解。当我们费劲写出方法去处理数据,lodash或许就有类似的方法,为了提高日常开发效率,我们就来学习一下lodash各个方法的源码。
chunk
我们就根据lodash文档的顺序来看一下各个方法的源码,首先就是数组的chunk方法。
- 用法:将数组拆分 成每份长度为n的数组,返回这些数组的集合,也就是二维数组。最后剩余长度不够n时,依旧返回,该方法的语法为:
js
_.chunk(array,size)
array为数组
size为长度 默认为1
_.chunk([1, 2, 3], 2); // [[1,2],[3]]
我们可以先思考一下,自己能否写一个类似的方法呢?下面我们就看下lodash的实现。
- 参数结果判断:首先判断size参数,确保size最终为正整数。toInteger 为lodash语言方法的一种,这里就是将size变成整数,再用Math.max与0做对比,确保为正整数。 接着判断结果,不满足拆分直接返回空数组。
- 根据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源码就是如此写法。
- 判断参数,为null,返回空数组。
- 用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。
- 参数判断,通过arguments长度进行非空判断,并且将array与other分开,用while或者other,lodash都是尽量避免使用原生Array方法,而是用循环等进行数据处理。
- 利用arrayPush完成连接,第一个参数会判断array运用三目运算确保实参为数组,第二个参数利用baseFlatten将剩余参数进行扁平化处理。查看一个arrayPush方法:
逻辑还是很清晰的,就是将第二个数组元素添加到第一个数组当中。
总结
以上就是lodash三个数组方法的源码解析,从这三个方法我们就能简单了解到lodash源码的风格,也能学习到数组循环,参数判断具体写法。