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

_.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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值