Help us understand the problem. What is going on with this article?

underscoreコードリーディング(findLastIndex)

More than 3 years have passed since last update.

underscoreに詳しくないので、勉強半分でソースコードを読む。

利用するバージョン

underscore.js(v1.8.3)

findLastIndexとは

underscorejs.orgのfindLastIndex

こんな説明。

_.findLastIndex(array, predicate, [context])

Like _.findIndex but iterates the array in reverse, returning the index closest to the end where the predicate truth test passes.

var users = [{'id': 1, 'name': 'Bob', 'last': 'Brown'},
             {'id': 2, 'name': 'Ted', 'last': 'White'},
             {'id': 3, 'name': 'Frank', 'last': 'James'},
             {'id': 4, 'name': 'Ted', 'last': 'Jones'}];
_.findLastIndex(users, {
  name: 'Ted'
});
=> 3

_.findLastIndexに似ているが、arrayを逆から走査し、predicateのテストでtrueが返ってきたものに一番近いindexの値をかえす。

underscore.findIndex

コード的にはこのあたり。

  _.findLastIndex = createPredicateIndexFinder(-1);

createPredicateIndexFinderに-1を渡しているのみ

createPredicateIndexFinderは以下

  // Generator function to create the findIndex and findLastIndex functions
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }

dir=-1なのでこうなる

function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = length - 1;
      for (; index >= 0 && index < length; index-- {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };

arrayのlength分だけfor文をindexがマイナスになるまで回す。
predicateに合致した場合はindexを返す。
for分を回しても返り値がなかった場合、-1を返す。

ikasumi_wt
プロダクト開発が好きななんでもやる系エンジニア。フロントエンドが好き。今はスクラムマスター専任。 名古屋 -> 東京 JavaScript loves. よく触っています。 Vue.js/Nuxt.js/Node.js/Express etc. + Python / Django(DRF) 過去:PHP/Laravel/Electron/Vue.js/React.js。
http://ikasumiwt.hatenadiary.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away