_.findIndex(array, [predicate=_.identity], [fromIndex=0])
12
_.findIndex(array, [predicate=_.identity], [fromIndex=0])
_.findIndex返回第一个predicate返回真值的元素的index索引
参数
array (Array): 查找的数组
[predicate=_.identity] (Function): 循环调用的函数
[fromIndex=0] (number): 查找的起始位置
返回值
(number): 返回符合要求的元素的索引
例子
var users = [ { 'user': 'barney', 'active': false }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': true } ]; _.findIndex(users, function(o) { return o.user == 'barney'; }); // => 0 // The `_.matches` iteratee shorthand. _.findIndex(users, { 'user': 'fred', 'active': false }); // => 1 // The `_.matchesProperty` iteratee shorthand. _.findIndex(users, ['active', false]); // => 0 // The `_.property` iteratee shorthand. _.findIndex(users, 'active'); // => 2
源代码:
源代码中baseIteratee的实现之前已经看过,所以这里省略。
//返回第一个predicate返回真值的元素的index索引 //array查找的数组,predicate判断的方法,fromIndex从哪里开始查找 function findIndex(array, predicate, fromIndex) { var length = array ? array.length : 0;//数组长度 if (!length) {//如果数组长度为0,返回-1 return -1; } var index = fromIndex == null ? 0 : toInteger(fromIndex);//循环的起始索引 if (index < 0) {//如果index是负数,就用length + index,最小为0 index = nativeMax(length + index, 0); } return baseFindIndex(array, baseIteratee(predicate, 3), index); //调用baseFindIndex,predicate用baseIteratee处理成函数,predicate可以有四种形式:一个函数,一个对象来深层比较是否相等,一个两个元素的数组来深层查找是否有相等的属性值,一个属性名来深层查找是否有对应属性名。这都是baseIteratee处理后的结果。 }
下面是baseFindIndex
//_.findIndex和_.findLastIndex的基础实现 //array查找的数组,predicate每次循环调用的函数,fromIndex遍历的起始位置,fromRight是否反向查找 function baseFindIndex(array, predicate, fromIndex, fromRight) { var length = array.length,//数组长度 index = fromIndex + (fromRight ? 1 : -1);//循环索引,如果反向循环就加1,如果正向就减1 while ((fromRight ? index-- : ++index < length)) {//正向就++,反向-- if (predicate(array[index], index, array)) { //调用predicate,根据其返回的真假值,如果返回true说明找到了 return index; } } return -1;//找不到返回-1 }