Ich frage mich, ob es eine bekannte, integrierte / elegante Möglichkeit gibt, das erste Element eines JS-Arrays zu finden, das einer bestimmten Bedingung entspricht. AC # -Äquivalent wäre List.Find .
Bisher habe ich eine Kombination mit zwei Funktionen wie diese verwendet:
// Returns the first element of an array that satisfies given predicate
Array.prototype.findFirst = function (predicateCallback) {
if (typeof predicateCallback !== 'function') {
return undefined;
}
for (var i = 0; i < arr.length; i++) {
if (i in this && predicateCallback(this[i])) return this[i];
}
return undefined;
};
// Check if element is not undefined && not null
isNotNullNorUndefined = function (o) {
return (typeof (o) !== 'undefined' && o !== null);
};
Und dann kann ich verwenden:
var result = someArray.findFirst(isNotNullNorUndefined);
Aber da es in ECMAScript so viele Array-Methoden im funktionalen Stil gibt, gibt es vielleicht schon so etwas? Ich stelle mir vor, dass viele Leute ständig solche Dinge implementieren müssen ...
javascript
arrays
Jakub P.
quelle
quelle
return (typeof (o) !== 'undefined' && o !== null);
auf dasreturn o != null;
. Sie sind genau gleichwertig.Antworten:
Seit ES6 gibt es die native
find
Methode für Arrays. Dadurch wird die Aufzählung des Arrays beendet, sobald die erste Übereinstimmung gefunden wurde, und der Wert wird zurückgegeben.Alte Antwort:
Ich muss eine Antwort posten, um diese
filter
Vorschläge zu stoppen :-)Sie können die
some
Array-Methode verwenden , um das Array zu iterieren, bis eine Bedingung erfüllt ist (und dann anzuhalten). Leider wird nur zurückgegeben, ob die Bedingung einmal erfüllt wurde, nicht von welchem Element (oder an welchem Index) sie erfüllt wurde. Also müssen wir es ein wenig ändern:quelle
some()
Auf der anderen Seite wird sofort zurückgegeben, was in fast allen Fällen viel schneller ist als das Filtern von Lösungen.Ab ECMAScript 6 können Sie
Array.prototype.find
dies verwenden. Dies ist in Firefox (25.0), Chrome (45.0), Edge (12) und Safari (7.1) implementiert und funktioniert, jedoch nicht in Internet Explorer oder einer Reihe anderer alter oder ungewöhnlicher Plattformen .Der folgende Ausdruck wird beispielsweise als ausgewertet
106
.Wenn Sie dies jetzt verwenden möchten, aber Unterstützung für IE oder andere nicht unterstützende Browser benötigen, können Sie einen Shim verwenden. Ich empfehle die es6-shim . MDN bietet auch eine Unterlegscheibe an, wenn Sie aus irgendeinem Grund nicht die gesamte es6-Unterlegscheibe in Ihr Projekt einfügen möchten. Für maximale Kompatibilität möchten Sie das es6-shim, da es im Gegensatz zur MDN-Version fehlerhafte native Implementierungen erkennt
find
und überschreibt (siehe den Kommentar, der mit "Umgehen von Fehlern in Array # find und Array # findIndex" beginnt, und die unmittelbar darauf folgenden Zeilen). .quelle
find
ist besser alsfilter
dafind
stoppt sofort, wenn ein Element gefunden wird, das der Bedingung entspricht, währendfilter
alle Elemente durchlaufen werden, um alle übereinstimmenden Elemente zu erhalten.Was ist mit der Verwendung von Filter und dem Abrufen des ersten Index aus dem resultierenden Array?
quelle
.shift
hier erklären ?shift
ist, dass es " schick aussieht", aber tatsächlich verwirrender ist. Wer würde denken, dass das Aufrufenshift()
ohne Argumente dasselbe ist wie das erste Element? Es ist unklar, IMO. Der Array-Zugriff ist ohnehin schneller: jsperf.com/array-access-vs-shift.shift()
über[0]
explizit wie folgt angegeben. Trotzdem ist es eine Alternative, die Sie wählen können oder nicht, ich würde mich jedoch daran halten[0]
.Inzwischen sollte klar sein, dass JavaScript keine solche Lösung von Haus aus bietet. Hier sind die beiden nächsten Ableitungen, die nützlichsten zuerst:
Array.prototype.some(fn)
bietet das gewünschte Verhalten beim Stoppen, wenn eine Bedingung erfüllt ist, gibt jedoch nur zurück, ob ein Element vorhanden ist; Es ist nicht schwer, einige Tricks anzuwenden, wie die Lösung, die Bergis Antwort bietet .Array.prototype.filter(fn)[0]
Dies ist ein großartiger Einzeiler, der jedoch am wenigsten effizient ist, da SieN - 1
Elemente wegwerfen , um das zu erhalten, was Sie benötigen.Herkömmliche Suchmethoden in JavaScript zeichnen sich dadurch aus, dass der Index des gefundenen Elements anstelle des Elements selbst oder -1 zurückgegeben wird. Dadurch wird vermieden, dass ein Rückgabewert aus der Domäne aller möglichen Typen ausgewählt werden muss. Ein Index kann nur eine Zahl sein und negative Werte sind ungültig.
Beide oben genannten Lösungen unterstützen auch keine Offset-Suche, daher habe ich beschlossen, Folgendes zu schreiben:
quelle
Zusammenfassung:
ES6
find()
find()
befindet sich auf,Array.prototype
so dass es auf jedem Array verwendet werden kann.find()
nimmt einen Rückruf entgegen, bei dem eineboolean
Bedingung getestet wird. Die Funktion gibt den Wert zurück (nicht den Index!)Beispiel:
quelle
Wenn Sie verwenden
underscore.js
, können Sie seinefind
undindexOf
Funktionen verwenden, um genau das zu erhalten, was Sie wollen:Dokumentation:
quelle
Ab ES 2015 ist
Array.prototype.find()
genau diese Funktionalität vorgesehen.Für Browser, die diese Funktion nicht unterstützen, hat das Mozilla Developer Network eine Polyfüllung bereitgestellt (unten eingefügt):
quelle
Array.prototype.find () macht genau das, weitere Informationen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
quelle
quelle
Ich habe mich von mehreren Quellen im Internet inspirieren lassen, um die unten stehende Lösung zu finden. Wollte sowohl einige Standardwerte berücksichtigen als auch eine Möglichkeit bieten, jeden Eintrag für einen generischen Ansatz zu vergleichen, den dies löst.
Verwendung: (Wert "Sekunde" angeben)
Implementierung:
quelle
In Javascript ist keine Funktion integriert, um diese Suche durchzuführen.
Wenn Sie jQuery verwenden, können Sie a
jQuery.inArray(element,array)
.quelle
$.inArray
gibt keinen Booleschen Wert zurück, sondern (überraschenderweise!) Den Index des ersten übereinstimmenden Elements. Es macht jedoch immer noch nicht das, was das OP verlangt hat.Eine weniger elegante Methode, mit der
throw
alle richtigen Fehlermeldungen (basierend aufArray.prototype.filter
) angezeigt werden, die jedoch beim ersten Ergebnis nicht mehr wiederholt werden, istDann sind Beispiele
Es funktioniert, indem es
filter
mit using endetthrow
.quelle