Wie kann ich überprüfen, ob ein array umfasst ein Objekt in JavaScript?
Was ist der prägnanteste und effizienten Weg, um herauszufinden, ob ein JavaScript-array ein Objekt enthält?
Dies ist der einzige Weg, ich weiß, es zu tun:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Gibt es eine bessere und genauere Weg, um dies zu erreichen?
Diese ist sehr eng mit Stack Overflow Frage Beste Weg zu finden, ein Element in ein JavaScript-Array?, welche Adressen das Auffinden von Objekten in einem array mit indexOf
.
gerade getestet: dein Weg ist tatsächlich der Schnellste bei allen Browsern: jsperf.com/find-element-in-obj-vs-array/2 (abgesehen von pre-speichern.Länge in einer Variablen), während indexOf (wie in $.inArray) ist viel langsamer
viele haben geantwortet, dass das Array#indexOf ist Ihre beste Wahl hier. Aber wenn du willst das etwas richtig cast zu Boolean, verwenden Sie diese:
Der Titel ist irreführend. Wo ist der
viele haben geantwortet, dass das Array#indexOf ist Ihre beste Wahl hier. Aber wenn du willst das etwas richtig cast zu Boolean, verwenden Sie diese:
~[1,2,3].indexOf(4)
0 zurück, die als false ausgewertet werden, in der Erwägung, dass ~[1,2,3].indexOf(3)
zurück -3, die als true ausgewertet werden.~
ist nicht das, was Sie verwenden möchten, um zu konvertieren, um einen booleschen Wert, für die, die Sie brauchen !
. Aber in diesem Fall wollen zu überprüfen, die Gleichheit mit -1, s o die Funktion könnte Endereturn [1,2,3].indexOf(3) === -1;
~
ist eine binäre nicht, wird es invertiert jedes bit der Wert individuell.[1,2,3].indexOf(4)
tatsächlich return -1. @Mcfedr darauf hingewiesen, ~
ist die bitwise-NICHT-operator finden Sie unter ES5 11.4.8. Sache ist, da die binäre Darstellung der -1
besteht aus nur 1, ist die Ergänzung ist 0
, die als false ausgewertet wird. Das Komplement jede andere Zahl ungleich null, also wahr. Also ~
Prima funktioniert, und wird oft in Verbindung mit indexOf
.Der Titel ist irreführend. Wo ist der
[[1,2],[3,4]].includes([3,4])
?InformationsquelleAutor brad | 2008-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktuellen Browser haben
- Array#include
, die nicht genau, stark unterstützt wird, und hat eine polyfill für ältere Browser.Können Sie auch
Array#indexOf
, das ist weniger direkt, aber nicht erforderlich Polyfills für out-of-date-Browser.jQuery bietet
$.inArray
, die funktionell äquivalent zuArray#indexOf
.underscore.js, ein JavaScript-Dienstprogramm-Bibliothek, bietet
_.contains(Liste, Wert)
, alias_.include(list, value)
, die beide verwenden indexOf intern wenn Sie überschritten wird, ein JavaScript-array.Einige andere frameworks bieten ähnliche Methoden:
dojo.indexOf(array, Wert, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
array.indexOf(value)
Ext.Array.enthält(array, value)
_.beinhaltet(array, Wert, [von])
(ist_.contains
vor 4.0.0)array.enthält(value)
Beachten Sie, dass einige frameworks implementieren diese als eine Funktion, während andere hinzufügen der Funktion zur array-Prototyp.
Prototyp hat auch
Array.include
, die einen booleschen Wert zurückgibtWenn Sie einen guten browser haben, können Sie nur verwenden
array.indexOf(object) != -1
Auch nicht mit indexOf allein als eine Bedingung, da das erste element 0 zurück und werden ausgewertet, als falsy
inArray
ist ein schrecklicher name für eine Funktion, die gibt den index des Elements, und-1
wenn es nicht vorhanden ist. Ich würde erwarten, dass ein boolean zurückgegeben werden.InformationsquelleAutor
Update: Wie @orip erwähnt in den Kommentaren, die verlinkten benchmark wurde im Jahr 2008 getan, so dass die Ergebnisse möglicherweise nicht relevant für moderne Browser. Allerdings werden Sie wahrscheinlich benötigen, diese zur Unterstützung von nicht in modernen Browsern überhaupt ist und Sie wahrscheinlich noch nicht aktualisiert worden seit. Testen Sie immer für sich selbst.
Wie schon andere gesagt haben, wird die iteration durch das array ist wohl der beste Weg, aber es hat sich bewährt, dass eine Verringerung
while
Schleife ist der Schnellste Weg zur Iteration in JavaScript. So möchten Sie vielleicht ändern Sie Ihren code wie folgt:Natürlich können Sie auch verlängern-Array-Prototyp:
Und jetzt können Sie verwenden Sie einfach die folgende:
"Bewiesen" ist ein starkes Wort. JS-engines ständig zu verbessern, und die Ausführungszeit gemessen vor 3 Jahren ist furchtbar veraltet.
Ich bin damit einverstanden. Vielleicht ändern Sie das Beispiel zu verwenden, indexOf, wenn verfügbar, nur damit die Leute kopieren-einfügen dieser code blind erhalten die beste Leistung, die Sie können.
ja, Pflege ist auf jeden Fall erforderlich. Es war wahrscheinlich ein Fall von tun
for (o in array)
was nicht getan werden sollte, wenn die Schleife durch das array in der Regel...Der beste Weg, dies zu tun ist, überprüfen Sie, ob [1, 2, 3].indexOf(1) > -1
InformationsquelleAutor Damir Zekić
indexOf
vielleicht, aber es ist ein "JavaScript-Erweiterung des ECMA-262-standard; als solche kann es nicht sein, in anderen Implementierungen des Standards."Beispiel:
AFAICS Microsoft hat nicht bieten irgendeine Art von alternative, aber Sie hinzufügen können, ähnlich wie Funktionen, arrays in Internet Explorer (und andere Browser, die nicht unterstützen
indexOf
) wenn Sie wollen, als schnelle Google-Suche zeigt (zum Beispiel, diese eine).eigentlich, wenn Sie hinzufügen, indexof, um den Prototyp-Array für Browser, die dies nicht unterstützen (z.B. IE7), werden Sie auch versuchen, um eine Schleife über diese Funktion beim Durchlaufen der Elemente im array. böse.
IE9 unterstützt nun diese
ist es zutreffend, zu prüfen, für das Objekt .? ich glaube nicht, dass es funktioniert im Fall des Objekts
InformationsquelleAutor cic
ECMAScript 7 stellt
Array.der Prototyp.includes
.Es kann z.B. so verwendet werden:
Er akzeptiert auch ein optionales zweites argument
fromIndex
:Im Gegensatz zu
indexOf
verwendet Strikte Gleichheit Vergleich,includes
vergleicht mit SameValueZero Gleichheit Algorithmus. Das bedeutet, dass Sie kann erkennen, wenn ein array enthält eineNaN
:Auch im Gegensatz zu
indexOf
,includes
nicht überspringen fehlende Indizes:Derzeit ist es noch ein Entwurf, aber können polyfilled, damit es funktioniert auf allen Browsern.
Auch relevant ist, sind die ES7 Kompatibilitäts-Tabelle (sieht aus wie chrome unterstützt es jetzt)
Erwähnenswert ist, dass diese unterstützt wird in Knoten 6+, nach - Knoten.grün
ist es zutreffend, zu prüfen, für das Objekt .? ich glaube nicht, dass es funktioniert im Fall des Objekts
InformationsquelleAutor Oriol
b
ist der Wert, unda
ist das array. Es gibttrue
oderfalse
:"~" ist ein operator, der den Etagen, kehrt und subtrahiert 1 von einer Zahl. indexOf-gibt -1 zurück, wenn es fehlschlägt, also "~" verwandelt -1 in die "0". mit "!!" macht zahlen in boleans (!!0===false)
die gleiche Leistung wie !=-1 jsperf.com/indexof-check
Nur ein bisschen throw-up, direkt in meinen Mund. Absolut unprofessionell-code.
Ich würde Sie anrufen und das fehlen der Kenntnisse über die Auswirkungen von booleschen Operatoren unprofessionell. Aber ich Stimme zu, über den Wert des lesbaren code wäre ich auf jeden Fall wickeln Sie diesen in eine eindeutig gekennzeichnete Funktion. Und das ist genau das, was die meisten gängigen JS-frameworks tun.
InformationsquelleAutor william malo
Den top-Antworten davon ausgehen, primitive Typen, aber wenn Sie möchten, um herauszufinden, ob ein array enthält ein Objekt mit einer gewissen Eigenschaft, Array.der Prototyp.einige() ist eine sehr elegante Lösung:
Das schöne daran ist, dass die iteration abgebrochen wird, sobald das element gefunden wird, damit unnötige iterationszyklen gespeichert werden.
Auch, es passt gut in eine
if
- Anweisung, da es ein boolean zurückgibt:* Als jamess wies darauf hin, in den Kommentar, wie von heute, September 2018,
Array.prototype.some()
ist vollständig unterstützt: caniuse.com support TabelleArbeiten in Knoten >=8.10 für AWS Node.js Lambda, das ist großartig. Sehr saubere und einfache Lösung! ??
Es kann gut unterstützt werden, aber denken Sie daran, dass
Arrow functions
in diesem Beispiel nicht so gut unterstützt. Weitere details finden Sie hier: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...InformationsquelleAutor Michael
Hier ein JavaScript 1.6 kompatibel Umsetzung von
Array.indexOf
:Sie sind nicht equvialent.
[].indexOf
ist eine Kurzform fürArray.prototype.indexOf
. Uns paranoid-defensive-Javascript-Programmierer vermeiden, erweitern nativen Prototypen auf alle Kosten.Nicht
[].indexOf
erstellen eines neuen array und dann Zugriff aufindexOf
, währendArray.prototype.indexOf
nur greift der Prototyp direkt?ja
[].indexOf === Array.prototype.indexOf
(versuchen Sie es in FireBug), aber Umgekehrt[].indexOf !== Array.indexOf
.InformationsquelleAutor Már Örlygsson
Verwenden:
x ? true : false
ist in der Regel überflüssig. Es ist hier.Warum sagst du es überflüssig?
array.indexOf(search) >= 0
ist schon ein boolean. Nurreturn array.indexOf(search) >= 0
.gut danke! Eigentlich wusste ich nicht, dass eine solche Konstruktion zurückgegeben werden konnte. TIL etwas neues.
Buchstäblich jedes Konstrukt in javascript zurückgegeben werden können
InformationsquelleAutor Matías Cánepa
Erweiterung der JavaScript -
Array
Objekt ist eine wirklich schlechte Idee, weil Sie die Einführung neuer Eigenschaften (Ihre eigenen Methoden) infor-in
Schleifen, die kann vorhandene Skripte. Vor ein paar Jahren die Autoren der Prototyp Bibliothek hatte zu re-konstruieren Ihre Bibliothek Implementierung zu entfernen, nur diese Art der Sache.Wenn Sie nicht brauchen, um sorgen über die Kompatibilität mit anderen JavaScript-Ausführung auf Ihrer Seite, denn es gehen, ansonsten würde ich empfehlen, die umständlicher, aber sicherer freistehend-Funktion-Lösung.
Würde dies berücksichtigt werden, monkey-patching? lol Manche Leute mögen das.
InformationsquelleAutor
Thinking out of the box für einen zweiten, wenn Sie diesen Aufruf viele, viele Male, es ist weitaus effizienter zu nutzen
assoziatives arrayeine Map zu tun-suchen unter Verwendung einer hash-Funktion.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
InformationsquelleAutor MattMcKnight
One-liner:
array.filter(e=>e==x).length > 0
entsprichtarray.some(e=>e==x)
abersome
ist effizienterInformationsquelleAutor AlonL
Benutze ich folgende:
InformationsquelleAutor Eduardo Cuomo
Array.der Prototyp.einige() wurde Hinzugefügt, um den ECMA-262-standard in der 5. edition
contains = (a, obj) => a.some((element) => element === obj))
Sogar der IE9 hat die Unterstützung für Array.der Prototyp.some() als ECMAScript 5.
InformationsquelleAutor dansalmo
Eine hoffentlich schnellere bidirektionale
indexOf
/lastIndexOf
alternative2015
Während die neue Methode enthält ist sehr nett, der support ist gleich null jetzt.
Es ist lange, dass ich dachte, der Weg zu ersetzen, der langsam indexOf/lastIndexOf Funktionen.
Performant Weg bereits gefunden wurde, einen Blick auf die top-Antworten. Aus diesen wählte ich die
contains
Funktion gepostet von @Damir Zekic, das sollte der Schnellste. Aber es zeigt auch, dass die benchmarks sind von 2008 und damit veraltet sind.Ich auch lieber
while
überfor
, aber für keinen bestimmten Grund, ich beendete das schreiben der Funktion mit einer for-Schleife. Es könnte auch mit einemwhile --
.War ich gespannt, ob die iteration war viel langsamer, wenn ich überprüfen Sie beide Seiten der array, während es zu tun. Anscheinend nicht, und so ist diese Funktion, um zwei mal schneller als die top-stimmten lieben. Natürlich, es ist auch schneller als der einheimische. Diese in einer realen Umgebung, wo man nie weiß, ob der Wert, den Sie suchen ist am Anfang oder am Ende des Arrays.
Wenn Sie wissen, dass Sie gerade geschoben, ein array mit einem Wert, mit lastIndexOf bleibt wahrscheinlich die beste Lösung, aber wenn du die Reise durch die große arrays und das Ergebnis könnte überall sein, könnte dies eine solide Lösung, um die Dinge schneller.
Bidirektionale indexOf/lastIndexOf
Performance-test
http://jsperf.com/bidirectionalindexof
Als test habe ich erstellt ein array mit 100 Einträgen.
Drei Abfragen: am Anfang, in der Mitte & am Ende des Arrays.
Ich hoffe, dass Sie auch dies interessant finden und testen Sie die Leistung.
Hinweis: Wie Sie sehen können, die ich leicht modifiziert die
contains
Funktion zu reflektieren, die indexOf - & lastIndexOf Ausgabe (also im Grundetrue
mit derindex
undfalse
mit-1
). Das sollte nicht Schaden.Die array-Prototyp-Variante
Kann die Funktion auch problemlos geändert werden, um true oder false zurückgeben oder sogar das Objekt, string oder was auch immer es ist.
Und hier ist die
while
Variante:Wie ist das möglich?
Ich denke, dass die einfache Rechnung, um die reflektierte index in einem array ist so simpel, dass es zwei mal schneller als eine aktuelle loop iteration.
Hier ist ein komplexeres Beispiel, drei Prüfungen pro iteration, dies ist aber nur möglich mit einer längeren Berechnung, die bewirkt, dass die Verlangsamung der code.
http://jsperf.com/bidirectionalindexof/2
InformationsquelleAutor cocco
Wenn Sie mit JavaScript 1.6 oder höher (Firefox 1.5 oder höher) können Sie Array.indexOf. Ansonsten, ich denke, Sie werden am Ende mit so etwas wie Ihr original-code.
InformationsquelleAutor Andru Luvisi
Checken Sie immer wieder auf die Existenz eines Objekts in einem array sollte man vielleicht schauen Sie in
contains(a, obj)
.InformationsquelleAutor Ztyx
Gibt array-index-wenn Sie gefunden wurde, oder -1, wenn nicht gefunden
InformationsquelleAutor LmC
Verwenden wir dieses snippet funktioniert mit Objekten, arrays, strings):
Verwendung:
InformationsquelleAutor dr.dimitru
Verwenden, lodash ist einige Funktion.
Es ist prägnant, präzise und hat eine große cross-Plattform-Unterstützung.
Die akzeptierte Antwort, die nicht einmal die Anforderungen erfüllen.
Anforderungen: Empfehlen prägnanten und effizienten Weg, um herauszufinden, ob ein JavaScript-array ein Objekt enthält.
Akzeptiert Antwort:
Meine Empfehlung:
Hinweise:
$.inArray funktioniert gut für die Bestimmung, ob ein scalar Wert in einem array existiert von skalaren...
... aber die Frage fragt nach einer effizienten Möglichkeit, um festzustellen, ob eine Objekt ist enthalten in ein array.
Damit sowohl Skalare und Objekte, Sie könnten dies tun:
InformationsquelleAutor l3x
Lösung, die funktioniert in allen modernen Browsern:
Verwendung:
IE6+ Lösung:
Verwendung:
Warum
JSON.stringify
?Array.indexOf
undArray.includes
(wie auch die meisten der Antworten hier) nur Vergleich von Referenz und nicht als Wert.Bonus
Nicht optimierten ES6 one-liner:
Hinweis:
Vergleich von Objekten von Wert wird besser funktionieren, wenn die Tasten in der gleichen Reihenfolge, so sicher zu sein, könnten Sie die Sortierung der keys erst mit einem Paket wie diesem: https://www.npmjs.com/package/sort-keys
Aktualisiert die
contains
Funktion mit einem perf-Optimierung. Dank itinance für den Hinweis it out.Aus performance-Gründen sollten Sie es vermeiden, stringifying. Zumindest sollten Sie vermeiden, zu JSON.stringify "obj" auf jeder Schleife, weil es ist teuer und verlangsamt die Anwendung. Daher solltest du es einzufangen, bevor die for-Schleife in eine temp-variable
guter Punkt. Aktualisiert die
includes
Funktion mit Ihrem Vorschlag. Ich habe jsperf mit meiner Funktion. Es ist etwa 5x langsamer als lodash s enthält. Obwohl lodash nicht zu vergleichen, nach Wert und nicht finden können{a: 1}
im[{a: 1}]
. Ich weiß nicht, ob jede Bibliothek hat es. Aber ich bin neugierig, ob es mehr performant und nicht wahnsinnig Komplex Weg, es zu tun.InformationsquelleAutor Igor Barbashin
Während
array.indexOf(x)!=-1
ist die prägnanteste Art und Weise, dies zu tun (und wurde unterstützt durch non-Internet Explorer-Browsern seit über zehn Jahren...), es ist nicht O(1), sondern O(N), das ist schrecklich. Wenn Ihr array wird nicht verändert, können Sie konvertieren Sie das array in einer hashtable, dann tuntable[x]!==undefined
oder===undefined
:Demo:
(Leider, während Sie ein Array erstellen.der Prototyp.enthält "einfrieren" ein array und speichern einer hashtable._cache in zwei Zeilen, dies würde falsche Ergebnisse, wenn Sie gewählt haben, Bearbeiten Sie Ihre array später. JavaScript hat nicht genügend Haken, um zu lassen Sie halten diesen Zustand, der im Gegensatz zu Python zum Beispiel.)
InformationsquelleAutor ninjagecko
ECMAScript-6 hat einen eleganten Vorschlag zu finden.
Hier ist die MDN-Dokumentation.
Die suchen-Funktionen wie das funktioniert.
Können Sie dies in ECMAScript 5 und unten von Definition der Funktion.
InformationsquelleAutor Pradeep Mahdevu
Verwenden:
Demo
Genau wissen, was der
tilde
~
an dieser Stelle tun, beziehen sich auf diese Frage Was bedeutet die tilde tun, wenn es vorausgeht einem Ausdruck?.Tatsächlich, es wurde noch nicht gepostet. Nicht als Antwort, sondern als Kommentar zu einer Antwort, und selbst dann ist es nicht klar und prägnant. Vielen Dank für den Beitrag, Mina Gabriel.
InformationsquelleAutor Mina Gabriel
Hier ist, wie Prototyp funktioniert es:
Siehe auch hier, wie Sie es hook up.
InformationsquelleAutor Ken
OK, kann man nur optimieren Sie Ihre code, um das Ergebnis zu erhalten!
Gibt es viele Möglichkeiten, dies zu tun, die sind besser und sauberer werden, aber ich wollte nur, um Ihre Muster und gelten, dass mit
JSON.stringify
nur einfach etwas tun, wie dies in Ihrem Fall:InformationsquelleAutor Alireza
Verwenden:
Ich weiß, es ist nicht der beste Weg zu gehen, aber da gibt es keine native IComparable Weg, um die Interaktion zwischen Objekten, ich denke, das ist so nah wie Sie bekommen können, vergleichen Sie zwei Elemente in einem array. Auch die Ausweitung Array-Objekt kann nicht eine kluge Sache zu tun, aber manchmal ist es OK (wenn Sie sich dessen bewusst sind und die trade-off).
InformationsquelleAutor Carlos A
Kann man Set , hat die Methode " ()":
return proxy.has(obj)
ist viel sauberer als in zwei Zeilen mit if-else-Anweisung hierInformationsquelleAutor rlib
Können Sie auch diesen trick verwenden:
InformationsquelleAutor user2724028
Wie andere erwähnt haben, die Sie verwenden können
Array.indexOf
, aber es ist nicht in allen Browsern verfügbar. Hier ist der code von https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf damit es funktioniert, das gleiche auch in älteren Browsern.InformationsquelleAutor Simon_Weaver