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))
?
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.
"_.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; })
_.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'