loadash.js源码学习笔记(4)

462 阅读1分钟

lodash.js->Array->findIndex

用法

传递一个方法/对象/属性名,通过条件查找第一个符合条件的元素的下标。

例子

    var gods = [
      { 'name': '韩立', 'fairy': false },
      { 'name': '林凡', 'fairy': false },
      { 'name': '王林', 'fairy': true }
    ];
    
    _.findIndex(gods, function(god) { return god.name === '林凡'; });
    // => 1
    _.findIndex(gods, { 'name': '林凡', 'fairy': false });
    // => 1
    _.findIndex(gods, ['fairy', false]);
    // => 0
    _.findIndex(gods, 'active');
    // => 2

源码理解


    function findIndex(array, predicate) {
      return (array && array.length)
        ? baseFindIndex(array, getIteratee(predicate, 3))
        : -1;
    }

    function baseFindIndex(array, predicate, fromRight) {
      var length = array.length,
      index = fromRight ? length : -1;

      while ((fromRight ? index-- : ++index < length)) {
        if (predicate(array[index], index, array)) {
          return index;
        }
      }
      return -1;
    }

    1.直接看核心代码
      while ((fromRight ? index-- : ++index < length)) {
        if (predicate(array[index], index, array)) {
          return index;
        }
      }
      return -1;

     findIndex未传递参数fromRight;所以循环条件为:++index<length;
     -1->length-1递增,即循环array,直到出现第一个满足predicate()条件的元素出现;
     循环完毕还没找到满足条件的元素,则返回 -1;

延申

使用较少,js原生API中已提供find和findIndex;此处做熟练和练习使用。