4980 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.

10voto

rlib Punkte 6436

Man kann verwenden Satz die die Methode "has()" hat:

function contains(arr, obj) {
      var proxy = new Set(arr);
      if (proxy.has(obj))
        return true;
      else
        return false;
    }

    var arr = ['Happy', 'New', 'Year'];
    console.log(contains(arr, 'Happy'));

8 Stimmen

Ich glaube return proxy.has(obj) ist viel sauberer als zwei Zeilen mit if-else-Anweisung hier

1 Stimmen

function contains(arr, obj) { return new Set(arr).has(obj); }

8voto

Mina Gabriel Punkte 19473

Verwendung:

var myArray = ['yellow', 'orange', 'red'] ;

alert(!!~myArray.indexOf('red')); //true

Demo

Um genau zu wissen, was die tilde ~ an dieser Stelle auf diese Frage verweisen Was bewirkt eine Tilde, wenn sie einem Ausdruck vorangestellt ist? .

6 Stimmen

Dies wurde bereits veröffentlicht vor anderthalb Jahren Sie brauchen es nicht zu wiederholen.

4 Stimmen

Sie wurde noch nicht veröffentlicht. Nicht als Antwort, sondern als Kommentar zu einer Antwort, und selbst dann ist er nicht klar und präzise. Danke, dass Sie es veröffentlicht haben, Mina Gabriel.

7voto

Sumer Punkte 2192

Ich bin überrascht, dass diese Frage immer noch nicht mit der neuesten Syntax versehen ist und füge meine 2 Cents hinzu.

Nehmen wir an, wir haben ein Array von Objekten arrObj und wollen obj darin suchen.

Array.prototype. indexOf -> (gibt zurück Index oder -1 ) wird im Allgemeinen verwendet, um den Index eines Elements in einem Array zu finden. Dies kann auch für die Suche nach Objekten verwendet werden, funktioniert aber nur, wenn Sie einen Verweis auf dasselbe Objekt übergeben.

let obj = { name: 'Sumer', age: 36 };
let arrObj = [obj, { name: 'Kishor', age: 46 }, { name: 'Rupen', age: 26 }];

console.log(arrObj.indexOf(obj));// 0
console.log(arrObj.indexOf({ name: 'Sumer', age: 36 })); //-1

console.log([1, 3, 5, 2].indexOf(2)); //3

Array.prototype. enthält -> (gibt zurück wahr o falsch )

console.log(arrObj.includes(obj));  //true
console.log(arrObj.includes({ name: 'Sumer', age: 36 })); //false

console.log([1, 3, 5, 2].includes(2)); //true

Array.prototype. finden. -> (nimmt Rückruf, gibt zuerst zurück Wert/Objekt die in CB true zurückgibt).

console.log(arrObj.find(e => e.age > 40));  //{ name: 'Kishor', age: 46 }
console.log(arrObj.find(e => e.age > 40)); //{ name: 'Kishor', age: 46 }

console.log([1, 3, 5, 2].find(e => e > 2)); //3

Array.prototype. findIndex -> (nimmt Rückruf, gibt zurück Index des ersten Wertes/Objekts, das in CB den Wert "true" liefert).

console.log(arrObj.findIndex(e => e.age > 40));  //1
console.log(arrObj.findIndex(e => e.age > 40)); //1

console.log([1, 3, 5, 2].findIndex(e => e > 2)); //1

Da find und findIndex einen Callback benötigt, können wir jedes Objekt (auch wenn wir die Referenz nicht haben) aus dem Array holen, indem wir kreativ die Bedingung true setzen.

7voto

Alireza Punkte 92209

OK, Sie können einfach Optimieren Sie Ihr Code, um das Ergebnis zu erhalten!

Es gibt viele Möglichkeiten, dies sauberer und besser zu tun, aber ich wollte einfach nur Ihr Muster übernehmen und mich darauf beziehen, indem ich JSON.stringify Machen Sie in Ihrem Fall einfach etwas Ähnliches:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (JSON.stringify(a[i]) === JSON.stringify(obj)) {
            return true;
        }
    }
    return false;
}

1 Stimmen

Späte Anmerkung: Dies funktioniert nicht mit, sagen wir, contains([{ a: 1, b: 2 }], { b: 2, a: 1 }) weil die stringifizierten Objekte die Reihenfolge der Eigenschaften beibehalten.

6voto

da coconut Punkte 710

Verwenden. Array.prototype.includes zum Beispiel:

const fruits = ['coconut', 'banana', 'apple']

const doesFruitsHaveCoconut = fruits.includes('coconut')// true

console.log(doesFruitsHaveCoconut)

lesen Sie vielleicht diese Dokumentation von MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

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