8

Underscore.js にはfindLast()メソッドまたは同等のものがありますか?

.find()コレクションで一致する最後のアイテムを返す最善の方法は何ですか?

4

3 に答える 3

13

リストを逆にして、次を使用しますfind

_.find(list.slice().reverse(), iterator);

のドキュメントについては、MDN を参照してくださいreverse


残念ながら、アンダースコアで囲まれたコレクションは、配列またはオブジェクトのいずれかです。コレクションが配列の場合は、幸運です。使用できますreverse。ただし、オブジェクトの場合は、代わりにこれを行う必要があります。

_.find(Object.keys(list).reverse(), function (key) {
    return iterator(list[key], key, list);
});

findLast自分で関数を書くことができます:

_.mixin({
    findLast: function (list, iterator, context) {
        if (list instanceof Array)
            return _.find(list.slice().reverse(), iterator, context);
        else return _.find(Object.keys(list).reverse(), function (key) {
            return iterator.call(context, list[key], key, list);
        });
    }
});

findLastこれで、他のアンダースコア メソッドと同じように使用できます。

于 2013-09-03T22:16:17.480 に答える
4

Underscore 1.8.0 では、これを達成するために使用できるメソッドfindLastIndexが導入されました。

var numbers = [1, 2, 3, 4];
var index = _.findLastIndex(numbers, isOddNumber);
if (index > 0) { console.log(numbers[index]); }
// returns 3
于 2015-12-24T16:07:32.090 に答える
3

@AaditMShahreverseで提案されているように、を使用するのが最も簡単な解決策ですが、配列をその場で操作することに注意してください。要素の順序を保持する必要がある場合reverseは、完了後にもう一度呼び出す必要があります。

を使用したくないreverse場合は、

  • 代わりにLodashを使用してください。_.findLast
  • Lodash から関連するコードを取得し、展開して独自の findLast を作成しますfindLastforEachRight

配列のみを扱い、オブジェクトを気にしない場合は、次のようになります。

function findLast (array, callback, thisArg) {
    var index = array.length,
        last;

    callback = callback && typeof thisArg == 'undefined' ? callback : _.bind(callback, thisArg);

    while (index--) {
        if (callback(array[index], index, array) == true) {
            last = array[index];
            break;
        }
    }

    return last;
}

(動作しますが、適切にテストしていません。したがって、これを読んでいる人は、コードをコピーするだけでなく、最初にいくつかのテストを実行してください。)

于 2014-01-07T14:55:33.507 に答える