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.

2voto

stamat Punkte 1664

Ich habe mir die eingereichten Antworten angesehen und festgestellt, dass sie nur gelten, wenn Sie das Objekt über eine Referenz suchen. Eine einfache lineare Suche mit Referenzobjektvergleich.

Aber nehmen wir an, Sie haben keinen Verweis auf ein Objekt, wie finden Sie dann das richtige Objekt im Array? Sie müssen linear vorgehen und bei jedem Objekt einen Tiefenvergleich durchführen. Stellen Sie sich vor, die Liste ist zu groß, und die Objekte darin sind sehr groß und enthalten große Textstücke. Die Leistung nimmt mit der Anzahl und Größe der Elemente im Array drastisch ab.

Sie können Objekte stringifizieren und in die systemeigene Hash-Tabelle einfügen, aber dann haben Sie Datenredundanz, weil JavaScript diese Schlüssel für 'for i in obj' speichert, und Sie wollen nur prüfen, ob das Objekt existiert oder nicht, d.h. Sie haben den Schlüssel.

Ich habe einige Zeit darüber nachgedacht, einen JSON-Schema-Validator zu konstruieren, und ich habe einen einfachen Wrapper für die systemeigene Hash-Tabelle entwickelt, ähnlich der alleinigen Hash-Tabellen-Implementierung, mit einigen Optimierungsausnahmen, die ich der systemeigenen Hash-Tabelle überlasse. Es muss nur noch ein Leistungs-Benchmarking durchgeführt werden... Alle Details und der Code können in meinem Blog nachgelesen werden: http://stamat.wordpress.com/javascript-quickly-find-very-large-objects-in-a-large-array/ Ich werde in Kürze Benchmark-Ergebnisse veröffentlichen.

Die vollständige Lösung funktioniert folgendermaßen:

var a = {'a':1,
 'b':{'c':[1,2,[3,45],4,5],
 'd':{'q':1, 'b':{'q':1, 'b':8},'c':4},
 'u':'lol'},
 'e':2};

 var b = {'a':1, 
 'b':{'c':[2,3,[1]],
 'd':{'q':3,'b':{'b':3}}},
 'e':2};

 var c = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";

 var hc = new HashCache([{a:3, b:2, c:5}, {a:15, b:2, c:'foo'}]); //init

 hc.put({a:1, b:1});
 hc.put({b:1, a:1});
 hc.put(true);
 hc.put('true');
 hc.put(a);
 hc.put(c);
 hc.put(d);
 console.log(hc.exists('true'));
 console.log(hc.exists(a));
 console.log(hc.exists(c));
 console.log(hc.exists({b:1, a:1}));
 hc.remove(a);
 console.log(hc.exists(c));

1voto

Shashwat Gupta Punkte 4257

Einfache Lösung: ES6-Funktionen " enthält " Methode

let arr = [1, 2, 3, 2, 3, 2, 3, 4];

  arr.includes(2) // true

  arr.includes(93) // false

1voto

francis Punkte 1763

Verwendung von RegExp:

console.log(new RegExp('26242').test(['23525', '26242', '25272'].join(''))) // true

0voto

MsiLucifer Punkte 440

Sie können die Funktion findIndex verwenden, um zu prüfen, ob ein Array einen bestimmten Wert enthält.

arrObj.findIndex(obj => obj === comparedValue) !== -1;

Gibt true zurück, wenn arrObj comparedValue enthält, andernfalls false.

-4voto

Ekim Punkte 953

Wörtlich:

(unter Verwendung von Firefox v3.6, mit for-in Vorbehalte wie bereits erwähnt (JEDOCH könnte die nachstehende Verwendung befürwortet werden for-in für genau diesen Zweck! Das heißt, die Aufzählung von Array-Elementen, die TATSÄCHLICH existieren, über einen Eigenschaftsindex (JEDOCH, insbesondere das Array length Eigenschaft ist NICHT in der Datei for-in Eigenschaftsliste!).).)

(Ziehen Sie die folgenden vollständigen URIs per Drag & Drop, um sie im Browser im Sofortmodus zu testen).

JavaScript:

  function ObjInRA(ra){var has=false; for(i in ra){has=true; break;} return has;}

  function check(ra){
      return ['There is ',ObjInRA(ra)?'an':'NO',' object in [',ra,'].'].join('')
  }
  alert([
            check([{}]), check([]), check([,2,3]),
            check(['']), '\t (a null string)', check([,,,])
        ].join('\n'));

der anzeigt:

There is an object in [[object Object]].
There is NO object in [].
There is an object in [,2,3].
There is an object in [].
     (a null string)
There is NO object in [,,].

Falten: Wenn Sie ein "bestimmtes" Objekt suchen, ziehen Sie es in Betracht:

JavaScript: alert({}!={}); alert({}!=={});

Und so:

JavaScript:

 obj = {prop:"value"}; 
 ra1 = [obj]; 
 ra2 = [{prop:"value"}];
 alert(ra1[0] == obj); 
 alert(ra2[0] == obj);

Häufig ra2 gilt als "enthalten" obj als die wörtliche Entität {prop:"value"} .

Eine sehr grobe, rudimentäre, naive (im Sinne von: der Code muss noch qualifiziert werden) Lösung:

JavaScript:

  obj={prop:"value"};   ra2=[{prop:"value"}];
  alert(
    ra2 . toSource() . indexOf( obj.toSource().match(/^.(.*).$/)[1] ) != -1 ?
      'found' :
      'missing' );

Siehe ref: Suche nach Objekten in JavaScript-Arrays .

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