__.first
_のようなものを__.filter
_で実現したい、つまり、要素のコレクションを持ち、真理値テスト(反復子)に一致する最初の要素(存在する場合)を取得したいと思います。
たとえば、次のような配列を指定します。
_var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}]
_
カスタム関数に一致する最初の(そして最初の)要素を取得したい:
__.filterFirst(arr, function(el) { return el.a > 10; }); // make it
_
これまでのところ:
__.first(arr) == {a:1}
_.filter(arr, function(...)) == [{a:11}, {a:15}]
_
_.first(_.filter(arr, iterator))
よりも優れたこれを行うためのクリーンなソリューションはありますか?
find
を使用できます:
リスト内の各値を調べて、真理値テスト(イテレータ)に合格する最初の値を返すか、テストに合格する値がない場合はundefinedを返します。この関数は、受け入れ可能な要素を見つけるとすぐに戻り、リスト全体を走査しません。
あなたの例を使用して:
var g = _.find(arr, function (x) { return x.a > 10 })
メインページを参照してください: http://underscorejs.org
(あなたの質問かもしれませんが)注意すべきもう1つのことは、呼び出しを結合するchain
関数です。
var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value()
filter
と 'first'の呼び出しに注意してください。これらの呼び出しは、入れ子にならずに互いに続くことができます。
「_.find」は良い解決策です。
別の解決策は、おそらくより高速ですが、「Array.prototype.every」を次のように使用することです。
var match;
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; })
_.find-lodashで: https://lodash.com/docs/4.17.10#find
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'