22

Ich möchte etwas wie _.first mit _.filter erreichen, das heißt, mit einer Sammlung von Elementen, würde ich gerne die erste (wenn vorhanden), die eine Wahrheit entspricht Test (Iterator).Holen Sie sich das erste Element einer Sammlung, die Iterator-Funktion entspricht

Zum Beispiel gegeben ein Array wie folgt aus:

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

Ich würde zuerst getthe mag (und nur die erste) Element, das meine benutzerdefinierte Funktion übereinstimmt:

_.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, dies zu tun, diebesser als ist?

+1

Werfen Sie einen Blick auf die Funktion find http://underscorejs.org/#find –

+0

Warum nicht nur _.filter (arr, iterator) [0] – levi

+1

@levi, weil es mehr CPU verbraucht als es sollte. – ducin

Antwort

51

können Sie find verwenden:

jeden Wert in der Liste wird durchsucht, die erste Rückkehr, die eine Wahrheit Test bestanden (Iterator) oder nicht definiert, wenn kein Wert den Test besteht. Die Funktion kehrt zurück, sobald sie ein akzeptables Element findet, , und durchläuft nicht die gesamte Liste.

mit Ihrem Beispiel:

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

die Hauptseite Siehe: http://underscorejs.org

andere Sache zu beachten (die Frage sein könnte) wird die chain Funktionsaufrufe miteinander verbinden:

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

Beachten Sie die Anrufe an filter und "erste", die einander folgen können r ohne Verschachtelung.

+1

genau! '_.find' ist was ich brauche! – ducin

+0

... oder Array.prototype.find(), aber es wird nicht vom IE unterstützt. Man kann jedoch ein Polyfill verwenden. Beachten Sie, dass die Übersetzung von ES2015 + nach ES5 nicht ausreicht. –

1

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

Eine alternative Lösung, vielleicht schneller, ist „Array.prototype.every“ auf diese Weise zu verwenden:

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