Die Methode indexOf() gibt den ersten Index zurück, an dem das übergebene Element im Feld gefunden wurde, oder -1, wenn es nicht vorhanden ist.

Hinweis: Für die String Methode schlage String.prototype.indexOf() nach.

Syntax

arr.indexOf(searchElement[, fromIndex])

Parameter

searchElement
Element, nach dem im Feld gesucht werden soll.
fromIndex Optional
Der Index, an dem die Suche begonnen wird. Ist der Index größer oder gleich der Länge des Arrays, so wird -1 zurückgegeben, was bedeutet, dass das Array nicht durchsucht wird. Ist der angegebene Index eine negative Zahl, wird er als Offset vom Ende des Arrays verwendet. Hinweis: Bei Verwendung eines negativen Index wird das Feld von vorne nach hinten durchsucht. Ist das errechnete Index kleiner als 0, so wird das ganze Array durchsucht. Default: 0 (Das gesamte Feld wird durchsucht)

Rückgabewert

Den ersten Index eines Elementes aus dem Array. -1 wenn keins gefunden wurde.

Beschreibung

indexOf() vergleicht searchElement mit den Elementen des Feldes und verwendet hierzu strikte Gleichheit (die gleiche Methode, die bei dem === - Operator (triple equals) angewendet wird).

Beispiele

indexOf() verwenden

Das folgende Beispiel verwendet indexOf(), um Werte in einem Feld zu lokalisieren.

var array = [2, 9, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0

Finde jedes Vorkommen eines Elementes

var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
  indices.push(idx);
  idx = array.indexOf(element, idx + 1);
}
console.log(indices);
// [0, 2, 4]

Finde heraus, ob ein Element bereits vorhanden ist und aktualisiere das Feld

function updateVegetablesCollection (veggies, veggie) {
    if (veggies.indexOf(veggie) === -1) {
        veggies.push(veggie);
        console.log('New veggies collection is : ' + veggies);
    } else if (veggies.indexOf(veggie) > -1) {
        console.log(veggie + ' already exists in the veggies collection.');
    }
}

var veggies = ['potato', 'tomato', 'chillies', 'green-pepper'];

updateVegetablesCollection(veggies, 'spinach'); 
// New veggies collection is : potato,tomato,chillies,green-papper,spinach
updateVegetablesCollection(veggies, 'spinach'); 
// spinach already exists in the veggies collection.

Polyfill

Die Methode indexOf() wurde im ECMA-262-Standard der fünften Edition hinzugefügt; sie könnte daher nicht in alles Browsern verfügbar sein. Das Fehlen kann umgangen werden, indem der folgende Quelltext zu Beginn eines Skriptes eingesetzt wird. Dies ermöglicht die Verwendung von indexOf(), auch wenn die Methode nicht nativ unterstützt wird. Dieser Algorithmus stimmt mit dem überein, welcher in ECMA-262, 5. Edition, spezifiziert wurde, unter der Annahme, dass TypeError and Math.abs() ihre originalen Werte haben.

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function indexOf(member, startFrom) {
    /*
    In non-strict mode, if the `this` variable is null or undefined, then it is
    set to the window object. Otherwise, `this` is automatically converted to an
    object. In strict mode, if the `this` variable is null or undefined, a
    `TypeError` is thrown.
    */
    if (this == null) {
      throw new TypeError("Array.prototype.indexOf() - can't convert `" + this + "` to object");
    }

    var
      index = isFinite(startFrom) ? Math.floor(startFrom) : 0,
      that = this instanceof Object ? this : new Object(this),
      length = isFinite(that.length) ? Math.floor(that.length) : 0;

    if (index >= length) {
      return -1;
    }

    if (index < 0) {
      index = Math.max(length + index, 0);
    }

    if (member === undefined) {
      /*
        Since `member` is undefined, keys that don't exist will have the same
        value as `member`, and thus do need to be checked.
      */
      do {
        if (index in that && that[index] === undefined) {
          return index;
        }
      } while (++index < length);
    } else {
      do {
        if (that[index] === member) {
          return index;
        }
      } while (++index < length);
    }

    return -1;
  };
}

Immer, wenn das Interesse mehr auf den kleinen technischen Details des ECMA Standards liegt und weniger auf Performance oder Knappheit, dann kann der folgendes beschreibende Polyfill sinnvoller sein.

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let o be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of o with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = fromIndex | 0;

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of o with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of o with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

Spezifikationen

Spezifikation Status Kommentar
ECMAScript 5.1 (ECMA-262)
Die Definition von 'Array.prototype.indexOf' in dieser Spezifikation.
Standard Initiale Definition. Implementiert in JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'Array.prototype.indexOf' in dieser Spezifikation.
Standard  
ECMAScript Latest Draft (ECMA-262)
Die Definition von 'Array.prototype.indexOf' in dieser Spezifikation.
Entwurf  

Browserkompatibilität

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Grundlegende Unterstützung Ja Ja1.59 Ja Ja
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Grundlegende Unterstützung Ja Ja Ja4 Ja Ja Ja

Kompatibilitätshinweis

  • Mit dem erscheinen von  Firefox 47 (Firefox 47 / Thunderbird 47 / SeaMonkey 2.44) gibt diese Methode nicht länger -0 zurück. Zum Beispiel: [0].indexOf(0, -0) wird nun immer +0 zurückgeben (Bug 1242043).

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

Mitwirkende an dieser Seite: schlagi123, Athyrion
Zuletzt aktualisiert von: schlagi123,