webentwicklung-frage-antwort-db.com.de

Ruft das erste Element einer Collection ab, das der Iteratorfunktion entspricht

Ich möchte etwas wie _.first mit _.filter erreichen, das heißt, mit einer Sammlung von Elementen möchte ich die erste (falls vorhanden) erhalten, die einem Wahrheitstest (Iterator) entspricht.

Zum Beispiel ein Array wie das folgende:

var arr = [{a: 1}, {a: 5}, {a: 9}, {a: 11}, {a: 15}]

Ich möchte das erste (und nur das erste) Element erhalten, das zu meiner benutzerdefinierten Funktion passt:

_.filterFirst(arr, function(el) { return el.a > 10; }); // make it

Bisher:

_.first(arr) == {a:1}
_.filter(arr, function(...)) == [{a:11}, {a:15}]

Gibt es eine saubere Lösung, die besser ist als _.first(_.filter(arr, iterator))?

31
ducin

Sie können find verwenden:

Durchsucht jeden Wert in der Liste und gibt den ersten Wert zurück, der besteht einen Wahrheitstest (Iterator) oder ist undefined, wenn kein Wert die. Prüfung. Die Funktion kehrt zurück, sobald ein akzeptables Element gefunden wird und durchquert nicht die gesamte Liste.

An deinem Beispiel:

var g = _.find(arr, function (x) { return x.a > 10 })

Siehe die Hauptseite: http://underscorejs.org

Eine andere Sache (die Ihre Frage möglicherweise ist) ist die chain-Funktion, um Aufrufe zusammenzufügen:

var g = _.chain(arr).filter(function (x) { return x.a > 10 }).first().value()

Beachten Sie die Aufrufe von filter und `first ', die ohne Verschachtelung aufeinander folgen können.

70
Tahir Hassan

"_.find" ist eine gute Lösung.

Eine alternative Lösung, möglicherweise schneller, ist die Verwendung von "Array.prototype.every" auf folgende Weise:

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

_.find - in 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