4952 Stimmen

Wie prüfe ich, ob ein Array einen Wert in JavaScript enthält?

Wie kann man am einfachsten und effizientesten herausfinden, ob ein JavaScript-Array einen Wert enthält?

Das ist die einzige Möglichkeit, die ich kenne:

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 prägnantere Möglichkeit, dies zu erreichen?

65 Stimmen

Gerade getestet: Ihr Weg ist tatsächlich der schnellste für alle Browser: jsperf.com/find-element-in-obj-vs-array/2 (abgesehen von der Vorabspeicherung von a.length in einer Variablen), während die Verwendung von indexOf (wie in $.inArray) viel langsamer ist

23 Stimmen

Viele haben geantwortet, dass die Array#indexOf ist Ihre beste Wahl hier. Aber wenn Sie etwas wollen, das korrekt in Boolean umgewandelt werden kann, verwenden Sie dies: ~[1,2,3].indexOf(4) wird 0 zurückgeben, was als falsch ausgewertet wird, während ~[1,2,3].indexOf(3) wird -3 zurückgeben, was als wahr ausgewertet wird.

13 Stimmen

~ ist nicht das, was Sie für die Konvertierung in einen Booleschen Wert verwenden wollen, dafür brauchen Sie ! . Aber in diesem Fall wollen Sie die Gleichheit mit -1 prüfen, damit die Funktion nicht endet return [1,2,3].indexOf(3) === -1; ~ nicht binär ist, wird jedes Bit des Wertes einzeln invertiert.

5459voto

codeape Punkte 93809

Moderne Browser haben Array#includes die die genau das und wird weitgehend unterstützt von allen außer dem IE:

console.log(['joe', 'jane', 'mary'].includes('jane')); //true

Sie können auch Folgendes verwenden Array#indexOf , die weniger direkt ist, aber keine Polyfills für veraltete Browser erfordert.

console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); //true

Auch viele Frameworks bieten ähnliche Methoden an:

Beachten Sie, dass einige Frameworks dies als Funktion implementieren, während andere die Funktion zum Array-Prototyp hinzufügen.

45 Stimmen

MooTools hat auch Array.contains, das einen Booleschen Wert zurückgibt, was hier die eigentliche Frage ist.

23 Stimmen

Prototyp hat auch Array.include die einen booleschen Wert zurückgibt

48 Stimmen

Wenn Sie einen guten Browser verwenden, können Sie einfach array.indexOf(object) != -1

508voto

Damir Zekić Punkte 15070

Update von 2019: Diese Antwort stammt aus dem Jahr 2008 (11 Jahre alt!) und ist für die moderne JS-Nutzung nicht relevant. Die versprochene Leistungsverbesserung basierte auf einem Benchmark, der in Browsern dieser Zeit durchgeführt wurde. Sie ist für moderne JS-Ausführungskontexte möglicherweise nicht mehr relevant. Wenn Sie eine einfache Lösung benötigen, suchen Sie nach anderen Antworten. Wenn Sie die beste Leistung benötigen, führen Sie selbst einen Benchmark in den entsprechenden Ausführungsumgebungen durch.

Wie andere bereits gesagt haben, ist die Iteration durch das Array wahrscheinlich der beste Weg, aber es hat sich bewährt dass eine abnehmende while Schleife ist der schnellste Weg, um in JavaScript zu iterieren. Sie können Ihren Code also wie folgt umschreiben:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

Natürlich können Sie auch den Prototyp Array erweitern:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

Und jetzt können Sie einfach das Folgende verwenden:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false

29 Stimmen

29 Stimmen

"Bewährt" ist ein starkes Wort. JS-Engines verbessern sich ständig, und die vor 3 Jahren gemessene Ausführungszeit ist furchtbar veraltet.

262voto

Michael Punkte 20836

Die oberen Antworten gehen von primitiven Typen aus, aber wenn Sie herausfinden wollen, ob ein Array ein Objekt mit einer bestimmten Eigenschaft, Array.prototype.some() ist eine elegante Lösung:

const items = [ {a: '1'}, {a: '2'}, {a: '3'} ]

items.some(item => item.a === '3')  // returns true
items.some(item => item.a === '4')  // returns false

Das Schöne daran ist, dass die Iteration abgebrochen wird, sobald das Element gefunden ist, so dass unnötige Iterationszyklen vermieden werden.

Außerdem passt es gut in einen if Anweisung, da sie einen booleschen Wert zurückgibt:

if (items.some(item => item.a === '3')) {
  // do something
}

* Wie jamess in ihrem Kommentar anmerkt, zum Zeitpunkt dieser Antwort, September 2018, Array.prototype.some() wird vollständig unterstützt: caniuse.com Unterstützungstabelle

250voto

cic Punkte 7048

indexOf vielleicht, aber es ist eine "JavaScript-Erweiterung des ECMA-262-Standards; als solche ist sie möglicherweise in anderen Implementierungen des Standards nicht vorhanden."

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft tut pas eine Art Alternative anbieten dazu, aber Sie können ähnliche Funktionen zu Arrays im Internet Explorer (und anderen Browsern, die keine Unterstützung für indexOf ), wenn Sie das wollen, als Eine schnelle Google-Suche ergibt (zum Beispiel, celui-ci ).

211voto

Oriol Punkte 246798

ECMAScript 7 führt ein Array.prototype.includes .

Sie kann wie folgt verwendet werden:

[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false

Sie akzeptiert auch ein optionales zweites Argument fromIndex :

[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true

Anders als indexOf , die die Strenger Gleichheitsvergleich , includes vergleicht mit SameValueZero Gleichheitsalgorithmus. Das bedeutet, dass Sie erkennen können, ob ein Array eine NaN :

[1, 2, NaN].includes(NaN); // true

Auch im Gegensatz zu indexOf , includes überspringt keine fehlenden Indizes:

new Array(5).includes(undefined); // true

Sie kann sein polygefüllt damit es in allen Browsern funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X