likes
comments
collection
share

源码学习——lodash(六)

作者站长头像
站长
· 阅读数 7

前言

上节我们讲解了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四种方法的用法与源码解析,本节倒是学到了用结构赋值获取数组长度的小方法。