1407 Stimmen

Bestimmen, ob ein Array einen Wert enthält

Ich muss feststellen, ob ein Wert in einem Array vorhanden ist.

Ich verwende die folgende Funktion:

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

Die obige Funktion gibt immer false zurück.

Die Array-Werte und der Funktionsaufruf lauten wie folgt:

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));

10 Stimmen

Der Code funktioniert in Safari 4.0.2. Übrigens: Ich würde eine === Vergleich anstelle von nur == .

1 Stimmen

"Die obige Funktion gibt immer false zurück." Nein, das tut sie nicht: Die Funktion funktioniert wie erwartet - der Fehler muss woanders liegen.

2 Stimmen

1022voto

codeape Punkte 93809

jQuery hat dafür eine Nutzenfunktion:

$.inArray(value, array)

Gibt den Index von value en array . Rückgabe -1 si array enthält nicht value .

Siehe auch Wie prüfe ich, ob ein Array ein Objekt in JavaScript enthält?

170 Stimmen

Lassen Sie sich vom Namen "inArray" nicht täuschen. Wie oben erwähnt (aber natürlich habe ich nicht genau genug gelesen), gibt -1 (nicht falsch) wenn das Element nicht vorhanden ist.

6 Stimmen

@Steve Paul was stimmt nicht mit dem Namen? er tut was er sagt: -1=er ist NICHT da, alles andere=er ist da

135 Stimmen

InArray' impliziert, dass ein Boolescher Wert zurückgegeben wird, der angibt, ob das Element im Array gefunden werden konnte. Daher könnten Benutzer versucht sein, folgenden Ausdruck zu verwenden: if ($.inArray('myval', myarray)) {...} Dieser Ausdruck ergibt true, wenn sich 'myval' NICHT in myarray befindet. Außerdem wird er als falsch ausgewertet, wenn der Index von 'myval' 0 ist.

1013voto

eyelidlessness Punkte 60421
var contains = function(needle) {
    // Per spec, the way to identify NaN is that it is not equal to itself
    var findNaN = needle !== needle;
    var indexOf;

    if(!findNaN && typeof Array.prototype.indexOf === 'function') {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function(needle) {
            var i = -1, index = -1;

            for(i = 0; i < this.length; i++) {
                var item = this[i];

                if((findNaN && item !== item) || item === needle) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    return indexOf.call(this, needle) > -1;
};

Sie können ihn wie folgt verwenden:

var myArray = [0,1,2],
    needle = 1,
    index = contains.call(myArray, needle); // true

CodePen-Validierung/Verwendung

4 Stimmen

Beachten Sie, dass indexOf auf Arrays im IE nicht implementiert ist, aber Sie können es selbst definieren

9 Stimmen

Sollten Sie einen typisierten Vergleich mit === um mit der nativen Implementierung kompatibel zu sein

3 Stimmen

Den Vergleich korrigiert und die fehlende return -1 Bitte beachten Sie, dass sich diese Methode gemäß der ES5-Spezifikation im Falle von vorzeichenbehafteten Nullen und NaNs anders verhält als die native Methode (siehe 15.4.4.14 und 9.12 vs. 11.9.6)

927voto

Gabriel Hurley Punkte 38778

Dafür ist im Allgemeinen die Methode indexOf() gedacht. Sie würden sagen:

return arrValues.indexOf('Sam') > -1

0 Stimmen

Ich mag wirklich, dass Sie dies tun können, die im Wesentlichen die gleiche Sache wie die jQuery-Antwort oben ist, aber ohne jQuery - plus Sie können es vereinfachen, wie Kenneth darauf hingewiesen, obwohl ich nicht machen konnte, dass in der Konsole arbeiten.

8 Stimmen

indexOf funktioniert nicht in <IE9.

1 Stimmen

Funktioniert nicht mit NaN

428voto

Dale Punkte 5507

Array.prototype.includes()

In ES2016 gibt es Array.prototype.includes() .

Le site includes() Methode bestimmt, ob ein Array ein bestimmtes Element enthält und gibt true o false nach Bedarf.

Beispiel

["Sam", "Great", "Sample", "High"].includes("Sam"); // true

Unterstützung

Nach Angaben von kangax y MDN werden die folgenden Plattformen unterstützt:

  • Chrom 47
  • Rand 14
  • Firefox 43
  • Oper 34
  • Safari 9
  • Knoten 6

Die Unterstützung kann erweitert werden durch Babel (mit babel-polyfill ) oder core-js . MDN bietet auch eine Polyfill :

if (![].includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

3 Stimmen

Ich bin versucht, diese Antwort über mehrere Javascript Fragen über mehrere variable Werte oder Arrays zu posten. Die polyfill von MDN ist nett.

3 Stimmen

Danke dafür! Babel polyfils es schön :-) Ich erinnere mich, vor 2 Jahren war jQuery in jedem Projekt und heute ist es Babel :) großer Gewinn für die JavaScript-Community! Es gibt eine Tabelle, was von ES7 bereits auf vielen Plattformen verfügbar ist, einschließlich babel pollyfils kangax.github.io/compat-table/es2016plus

144voto

ncabral Punkte 2504

Es ist fast immer sicherer, eine Bibliothek wie lodash einfach wegen all der Probleme mit der Kompatibilität zwischen verschiedenen Browsern und der Effizienz.

Effizienz, weil man sich sicher sein kann, dass eine sehr populäre Bibliothek wie underscore zu jedem Zeitpunkt die effizienteste Methode hat, um eine solche Funktion auszuführen.

_.includes([1, 2, 3], 3); // returns true

Wenn Sie Bedenken haben, dass Ihre Anwendung durch die Einbindung der gesamten Bibliothek zu umfangreich wird, können Sie die Funktionen auch separat einbinden:

var includes = require('lodash/collections/includes');

HINWEIS: Bei älteren Versionen von lodash war dies _.contains() statt _.includes() .

13 Stimmen

@threed, Sie müssen nicht die gesamte Bibliothek einbeziehen. Ein Teil der Funktionalität kann mit require('lodash/collections/contains') eingebunden werden.

26 Stimmen

FYI: Mit lodash 4 ist es jetzt _.includes() anstelle von _.contains() .

2 Stimmen

Hilfsbibliotheken mögen praktisch erscheinen, ändern sich aber (zu) oft, siehe Kommentar oben "lodash 4 ' .enthält()' ist jetzt ' .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