源码学习——lodash(九)

前言

上节我们学习了lodash中pull系列方法的源码,本节我们继续往下学习数组方法的源码。

remove

remove方法会移除条件为真的数据,并返回由移除数组组成的新数组。该方法效果跟filter一样,但是它会改变原数组

js 复制代码
_.remove(array,predicate)
//predicate迭代函数
const arr = [1,2,3,4]
console.log(_.renove(arr,(x)=>x>2))//[3,4]
console.log(arr)//[1,2]

注意predicate是循环条件,除了函数,它也可以字符串、对象等。当predicate为函数时,它包含三个参数:

  • value:当前元素。
  • index:当前下标。
  • array:循环数组。
    remove就是会改变原数组的filter,我们可以先看下filter的源码:
  • 声明两个变量,index判断条件及predicate中的下标,resIndex返回结果的下标。
  • 获取数组长度length并声明result。
  • 通过while循环,将通过predicate的元素添加到result中,最终返回result。
    注意index为-1,resIndex为0,一个用了前置++,一个用了后置++,之所以这么写可能是为了后续更好地阅读理解。remove的方法我们可以先根据filter修改下,达到想要的效果。简单的做法就是在if后面加个else,将不满足的元素添加到另一个数组中,并将array赋值成该数组。
js 复制代码
let arr = []
let arrInx = 0
if (predicate(value, index, array)) {
result[resIndex++] = value;
}else {
arr[arrInx++] = value
}
array = arr

当然我们直接用js数组方法中的splice会更加方便,下面我们来看下remove的源码,看lodash是如何操作的:

  • 声明result并对array进行非空判断,声明index循环下标及下标数组。
  • 通过while循环数组,当满足条件将value添加到result中,将index添加到indexs中。
  • 通过basePullAt方法修改原数组,返回result。
    remove思路跟filter是一样的,只不过添加跟修改都是用的lodash中的其它数组方法,basePullAt上节我们刚好讲解过。

reverse与slice

reverse

reverse方法将原数组进行翻转并返回翻转后的数组,该方法会改变原数组。

js 复制代码
_.reverse(array)
console.log(_.reverse([1,2,3])) //[3,2,1]

该方法的实现有多种,while循环添加的每个元素,从array后面取即可:

js 复制代码
whlie(index<length){
result[index] = array[length-index]
}
array = result

下面我们来看下lodash的源码,看有什么妙法没:

js 复制代码
function reverse(array) {
return array == null ? array : nativeReverse.call(array);
}

nativeReverse = arrayProto.reverse;

lodash中就是做了一个非空判断,用的是原生reverse方法。

slice

slice方法用来截取数组,并返回截取部分的新数组,用法效果跟原生slice一样。

js 复制代码
_.slice(array,start,end)
// start 开始下标 默认为0
// end 结束下标 默认为数组长度
console.log(_slice([1,2,3],0,2)) //[1,2]

注意截取的数据不包含end,该方法官方文档上也明确了就是为了替代原生slice方法。该方法我们之前讲解其它方法也讲解过,本节就在熟悉一下:

重点是start、end的判断,获取正确的下标,然后通过while循环赋值。

总结

以上就是lodash三种方法的源码,通过本节我们也能知道对于一些简单没必要重写的数组方法,lodash会直接采用,而不会更改。

相关推荐
龙飞05几秒前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、5 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao5 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly12 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)41 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751543 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育44 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再44 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose1 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花1 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架