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

相关推荐
「、皓子~10 分钟前
后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
前端·人工智能·微服务·小程序·go·ai编程·ai写作
就改了13 分钟前
Ajax——在OA系统提升性能的局部刷新
前端·javascript·ajax
凌冰_15 分钟前
Ajax 入门
前端·javascript·ajax
京东零售技术30 分钟前
京东小程序JS API仓颉改造实践
前端
奋飛39 分钟前
TypeScript系列:第六篇 - 编写高质量的TS类型
javascript·typescript·ts·declare·.d.ts
老A技术联盟39 分钟前
从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析
前端·小程序
风铃喵游43 分钟前
构建引擎: 打造小程序编译器
前端·小程序·架构
sunbyte1 小时前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
前端·javascript·css·vue.js·前端框架·tailwindcss
小飞悟1 小时前
🎯 什么是模块化?CommonJS 和 ES6 Modules 到底有什么区别?小白也能看懂
前端·javascript·设计
浏览器API调用工程师_Taylor1 小时前
AOP魔法:一招实现登录弹窗的全局拦截与动态处理
前端·javascript·vue.js