前言
上节我们讲解了lodash中flateen系列方法,本节我们继续学习其他方法的源码。
indexOf
indexOf查找与value相同的元素,并返回首次相等的索引,没有则返回-1。如果我们把前面提到的findIndex判断条件变成与value相同的条件,结果是一样的。
_.indexOf(array,value,index)
array:数组 value:值 index:开始下标,默认为0,如果为负数则从末端开始
_indexOf([1,2],2) // 1
结合三个参数的定义以及findIndex的经验,我们先自己实现一下:
思路很简单,先进行非空判断,然后用三目运算处理index,得到开始索引下标。注意我们要考虑index为负数的情况,然后用for循环进行判断最终返回result。这方法就是中规中矩地处理,接下来我们来看下lodash的源码:
- 非空判断起手,然后就是fromIndex的判断,对于index<0的情况,通过Math.max避免了index+length也小于0的情况。
- 将处理好的参数传入到baseIndexOf核心方法中,得到结果。
接下来我们看下baseIndexOf的源码:
有点意外,baseIndexOf用了三目运算,对value进行严格相等根据结果执行不同的函数,之所以‘多此一举’是为了确保特殊值的判断,比如NaN,在js中NaN相当于独立,与其他NaN相比返回值就为false。于是源码进行了判断,然后采用了两个方法。
- 为true用strictIndexOf方法:
通过结构赋值获取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
相较于indexOf,lastIndexOf主要区别在于两个方法:为true用strictLastIndexOf方法,为false依旧是baseFindIndex就是将第四个参数设置了为true。
strictLastIndexOf方法中while判断条件从++变为了–。
initial与last
initial去除数组最后一个元素并返回新数组,该方法就比较简单,很容易想到进行循环赋值。
_.initial(array)
_.initial([1,2]) //[1]
源码中是先进行了非空判断,然后用slice方法进行处理,slice方法之前我们也讲解过。
last方法是获取数组中最后一个元素,这个比initial还简单。
const {length} = array
return array[length-1]
对比下源码:
核心思路一样,就是多了些判断。
总结
以上就是lodash四种方法的用法与源码解析,本节倒是学到了用结构赋值获取数组长度的小方法。
原文链接:https://juejin.cn/post/7352146336987496463 作者:躺平使者