zl程序教程

您现在的位置是:首页 >  其它

当前栏目

_.findIndex(array, [predicate=_.identity], [fromIndex=0])

Array identity _. Predicate
2023-09-11 14:15:02 时间

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
}