Frage Wie überprüfe ich, ob ein Array ein Objekt in JavaScript enthält?


Was ist die prägnanteste und effizienteste Methode, um herauszufinden, ob ein JavaScript-Array ein Objekt enthält?

Das ist die einzige Art, wie ich es weiß:

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

Gibt es einen besseren und prägnanteren Weg, dies zu erreichen?

Dies ist sehr eng mit Stack Overflow Frage verwandt Der beste Weg, um ein Objekt in einem JavaScript-Array zu finden? mit dem sich Objekte in einem Array suchen lassen indexOf.


3217
2017-10-25 22:14


Ursprung


Antworten:


Aktuelle Browser haben Array#includeswas tut genau Das, wird weitgehend unterstütztund hat a Polyfill für ältere Browser.

> ['joe', 'jane', 'mary'].includes('jane');
true 

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

jQuery bietet $.inArray, die funktionell entspricht Array#indexOf.

Unterstrich.js, eine JavaScript-Dienstprogramm-Bibliothek, bietet _.contains(list, value), alias _.include(list, value), die beide verwenden Index von intern, wenn ein JavaScript-Array übergeben.

Einige andere Frameworks bieten ähnliche Methoden an:

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


3644
2017-10-25 23:10



Update: Wie @orip in Kommentaren erwähnt, wurde der verknüpfte Benchmark im Jahr 2008 erstellt, sodass die Ergebnisse für moderne Browser möglicherweise nicht relevant sind. Wahrscheinlich benötigen Sie dies jedoch, um nicht-moderne Browser zu unterstützen, und sie wurden wahrscheinlich seither nicht mehr aktualisiert. Teste immer für dich selbst.

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

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 Array-Prototyp 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 Folgendes verwenden:

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

357
2017-10-25 22:49



indexOf vielleicht, aber es ist eine "JavaScript-Erweiterung für den ECMA-262-Standard; als solche kann es in anderen Implementierungen des Standards nicht vorhanden sein."

Beispiel:

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

AFAIK Microsoft tut es nicht biete eine Art Alternative an Dazu können Sie jedoch ähnliche Funktionen zu Arrays in Internet Explorer (und anderen Browsern, die dies nicht unterstützen) hinzufügen indexOf) wenn du willst, als schnelle Google-Suche zeigt (beispielsweise, dieses).


156
2018-01-01 01:40



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

Es kann so verwendet werden:

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

Es akzeptiert auch ein optionales zweites Argument fromIndex:

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

nicht wie indexOf, die verwendet Strenger Gleichheitsvergleich, includes vergleicht mit SameValueZero Gleichheitsalgorithmus. Das bedeutet, dass Sie erkennen können, ob ein Array einen enthält NaN:

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

Auch anders indexOf, includes überspringt keine fehlenden Indizes:

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

Momentan ist es noch ein Entwurf, kann aber sein polygefülltdamit es in allen Browsern funktioniert.


128
2018-03-24 04:59



b ist der Wert und a ist das Array. Es kehrt zurück true oder false:

function(a, b) {
    return a.indexOf(b) != -1
}

96
2017-10-27 00:38



Hier ist ein JavaScript 1.6 kompatibel Implementierung von Array.indexOf:

if (!Array.indexOf)
{
  Array.indexOf = [].indexOf ?
      function (arr, obj, from) { return arr.indexOf(obj, from); }:
      function (arr, obj, from) { // (for IE6)
        var l = arr.length,
            i = from ? parseInt( (1*from) + (from<0 ? l:0), 10) : 0;
        i = i<0 ? 0 : i;
        for (; i<l; i++) {
          if (i in arr  &&  arr[i] === obj) { return i; }
        }
        return -1;
      };
}

65
2017-09-13 17:32



Benutzen:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

// Usage
if(isInArray(my_array, "my_value"))
{
    //...
}

46
2017-08-27 16:45



Erweitern Sie das JavaScript Array Objekt ist eine wirklich schlechte Idee, weil Sie neue Eigenschaften (Ihre eigenen Methoden) einführen for-in Schleifen, die bestehende Skripte brechen können. Vor einigen Jahren haben die Autoren der Prototyp Die Bibliothek musste ihre Bibliotheksimplementierung neu konstruieren, um genau diese Art von Dingen zu entfernen.

Wenn Sie sich keine Sorgen über die Kompatibilität mit anderem JavaScript auf Ihrer Seite machen müssen, sollten Sie sich dafür entscheiden. Andernfalls würde ich die etwas schwierigere, aber sicherere Lösung für die freistehende Funktion empfehlen.


38
2017-07-18 14:36



Sie können verwenden Array.prototype.some ()

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

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

Umgekehrt wird die Iteration abgebrochen, sobald das Element gefunden wurde, so dass unnötige Iterationszyklen gespeichert werden.

Eine Sache zu beachten ist, dass some() ist nicht in allen js-Versionen vorhanden: (von der Website)

einige wurden in der 5. Auflage zum Standard ECMA-262 hinzugefügt; als solche es   möglicherweise nicht in allen Implementierungen des Standards vorhanden

Sie können es ohne Probleme in Node.js verwenden. Wenn Sie alle Browser unterstützen müssen, dann gibt es dieses Polyfill (vom selben Link):

if (!Array.prototype.some)
{
  Array.prototype.some = function(fun /*, thisArg */)
  {
    'use strict';

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function')
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t && fun.call(thisArg, t[i], i, t))
        return true;
    }

    return false;
  };
}

33
2018-01-07 12:49