源码学习——lodash(六)

前言

上节我们讲解了lodash中flateen系列方法,本节我们继续学习其他方法的源码。

indexOf

indexOf查找与value相同的元素,并返回首次相等的索引,没有则返回-1。如果我们把前面提到的findIndex判断条件变成与value相同的条件,结果是一样的。

_.indexOf(array,value,index)
array:数组 value:值 index:开始下标,默认为0,如果为负数则从末端开始
_indexOf([1,2],2) // 1

结合三个参数的定义以及findIndex的经验,我们先自己实现一下:

源码学习——lodash(六)
思路很简单,先进行非空判断,然后用三目运算处理index,得到开始索引下标。注意我们要考虑index为负数的情况,然后用for循环进行判断最终返回result。这方法就是中规中矩地处理,接下来我们来看下lodash的源码:
源码学习——lodash(六)

  1. 非空判断起手,然后就是fromIndex的判断,对于index<0的情况,通过Math.max避免了index+length也小于0的情况。
  2. 将处理好的参数传入到baseIndexOf核心方法中,得到结果。
    接下来我们看下baseIndexOf的源码:

源码学习——lodash(六)
有点意外,baseIndexOf用了三目运算,对value进行严格相等根据结果执行不同的函数,之所以‘多此一举’是为了确保特殊值的判断,比如NaN,在js中NaN相当于独立,与其他NaN相比返回值就为false。于是源码进行了判断,然后采用了两个方法。

  • 为true用strictIndexOf方法:
    源码学习——lodash(六)
    通过结构赋值获取arry的长度,这种用法确实少见,又学到了。接着用while循环,这个判断条件很关键,将index++放到了条件里面,平时用到最多的应该是放到执行代码里面。当找到相等的值就返回当前index否则返回-1。
  • 为fasle用baseFindIndex方法,其中第二个参数为baseIsNaN:
function baseIsNaN(value) {
  return value !== value
}

baseFindeIndex在讲解findIndex系列讲过,第二个参数为执行函数,当value为NaN时,baseIsNaN返回true,得到index下标。不得不说lodash考虑得就是很全面。

lastIndexOf

lastIndexOf跟indexOf类似,不过它是从右边开始遍历的,前面我们碰到类似的都会与fronRihgt参数进行兼容,这两组应该也不例外。

_.lastIndexOf(array,value,index)
_lastIndexOf([2,1],2) // 0

源码学习——lodash(六)
相较于indexOf,lastIndexOf主要区别在于两个方法:为true用strictLastIndexOf方法,为false依旧是baseFindIndex就是将第四个参数设置了为true。

源码学习——lodash(六)
strictLastIndexOf方法中while判断条件从++变为了–。

initial与last

initial去除数组最后一个元素并返回新数组,该方法就比较简单,很容易想到进行循环赋值。

_.initial(array)
_.initial([1,2]) //[1]

源码学习——lodash(六)
源码中是先进行了非空判断,然后用slice方法进行处理,slice方法之前我们也讲解过。
last方法是获取数组中最后一个元素,这个比initial还简单。

const {length} = array
return array[length-1]

对比下源码:

源码学习——lodash(六)
核心思路一样,就是多了些判断。

总结

以上就是lodash四种方法的用法与源码解析,本节倒是学到了用结构赋值获取数组长度的小方法。

原文链接:https://juejin.cn/post/7352146336987496463 作者:躺平使者

(0)
上一篇 2024年3月31日 上午10:16
下一篇 2024年3月31日 上午10:26

相关推荐

发表回复

登录后才能评论