越看越菜系列
用法:根据fromIndex向左或者向右查找符合条件的第一个元素的索引。
function baseFindIndex(array, predicate, fromIndex, fromRight)
- array 指输入的待查找数组
- predicate 指的是查找条件,是一个函数
- fromIndex 查找的起始点
- fromRight 为true时,从右向左查找; 为false或者不填的时候从左向右查找。
源码分析 :
function baseFindIndex(array, predicate, fromIndex, fromRight) {
const { length } = array
let index = fromIndex + (fromRight ? 1 : -1)
while ((fromRight ? index-- : ++index < length)) {
if (predicate(array[index], index, array)) {
return index
}
}
return -1
}
先嘀咕一句,这代码也太好看了吧,都快有我家小骄傲3/4可爱了。
-
其中的
fromRight ? index-- : ++index < length
可以解析为fromRight ? ( index-- ): ( ++index )< length
为啥这样? js 基础再来回顾一下:运算符汇总表
-
++index index--
以及let index = fromIndex + (fromRight ? 1 : -1)
都是为啥呢?
- array 的 index 范围是 0 - length - 1 。 也即,
index === 0
时,循环应继续 , 故实际循环次数为 fromIndex + 1 ,index--
(不妨举例为3) 变化顺序为 4,3,2,1 四次,从 3 + 1开始也正是上面标注的第二句的用途。 - 若为从左往右,此时 实际循环次数为 length - fromIndex 。不妨举例 length 为 5 ,此时 " ++ index"变换顺序为 2 , 3 , 4,
let index = fromIndex + (fromRight ? 1 : -1)
使得 fromIndex 从 2 开始