web-dev-qa-db-ja.com

イテレータ関数に一致するコレクションの最初の要素を取得します

__.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))よりも優れたこれを行うためのクリーンなソリューションはありますか?

37
ducin

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'の呼び出しに注意してください。これらの呼び出しは、入れ子にならずに互いに続くことができます。

74
Tahir Hassan

「_.find」は良い解決策です。

別の解決策は、おそらくより高速ですが、「Array.prototype.every」を次のように使用することです。

var match;
arr.every(function(x) { if (x.a > 10) { match = x; return false;} return true; })
0
Juan Cortines

_.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'
0
BigMan73