Underscore.js にはfindLast()
メソッドまたは同等のものがありますか?
.find()
コレクションで一致する最後のアイテムを返す最善の方法は何ですか?
Underscore.js にはfindLast()
メソッドまたは同等のものがありますか?
.find()
コレクションで一致する最後のアイテムを返す最善の方法は何ですか?
リストを逆にして、次を使用します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
これで、他のアンダースコア メソッドと同じように使用できます。
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
@AaditMShahreverse
で提案されているように、を使用するのが最も簡単な解決策ですが、配列をその場で操作することに注意してください。要素の順序を保持する必要がある場合reverse
は、完了後にもう一度呼び出す必要があります。
を使用したくないreverse
場合は、
_.findLast
findLast
。forEachRight
配列のみを扱い、オブジェクトを気にしない場合は、次のようになります。
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;
}
(動作しますが、適切にテストしていません。したがって、これを読んでいる人は、コードをコピーするだけでなく、最初にいくつかのテストを実行してください。)