Mozilla's getting a new look. What do you think? https://mzl.la/brandsurvey

Array.prototype.indexOf()

El mètode indexOf() retorna la primera posició a la qual es troba l'element proporcionat, o bé -1 si l'element no es troba dins l'array.

Sintaxi

arr.indexOf(elementAcercar[, posicioInicial = 0])

Paràmetres

elementAcercar
L'element que es cercarà.
posicioInicial
La posició a la qual començar la cerca. Si la posició és major o igual a la longitud de l'array, es retornarà -1, això implica que no es realitzarà cap cerca a l'array. Si es proporciona un onmbre negatiu, es calcularà la posició des de la qual cercar des del final de l'array. Nota: l'array sempre es cercarà accedint a les posicions en ordre ascendent encara que la posicioInicial sigui negatiu. Si la posició proporcionada és 0 es cercarà en tot l'array. El valor per defecte és 0 (cerca a tot l'array).

Descripció

indexOf() compara elementAcercar amb els elements de l'array mitjançant la igualtat estricta (el mateix mètode utilitzat per l'operador ===, també anomenat triple-equals).

Exemples

Utilitzar indexOf()

L'exemple següent utilitza indexOf() per a localitzar valors dins un array.

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

Trobar totes les ocurrències d'un element

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]

Determinar si un element existeix o no a l'array i actualitzar-lo

function updateVegetablesCollection (veggies, veggie) {
    if (veggies.indexOf(veggie) === -1) {
        veggies.push(veggie);
        console.log('La nova col·lecció de verdures és : ' + veggies);
    } else if (veggies.indexOf(veggie) > -1) {
        console.log(veggie + ' ja existeix a la col·lecció de verdures.');
    }
}

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

updateVegetablesCollection(veggies, 'spinach'); 
//  La nova col·lecció de verdures és : potato,tomato,chillies,green-papper,spinach
updateVegetablesCollection(veggies, 'spinach'); 
// spinach  ja existeix a la col·lecció de verdures.

Polyfill

indexOf() va ser afegit al standard ECMA-262 a la cinquena versió; degut a això pot no estar present en tots els navegadors. Afegir el següent codi al principi dels vostres escripts us permetrà utilitzar aquesta funció en navegadors on indexOf no sigui suportada de forma nativa. Aquest algoritme és el mateix que l'especificat a la cinquena versió de l'ECMA-262, donat que TypeError i Math.abs() no han estat modificats.

// 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. Sigui o el resultat de cridar ToObject passant
    //    el valor de this com a argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Sigui lenValue el resultat de cridar el mètode intern Get
    //    de o amb l'argument "length".
    // 3. Sigui len ToUint32(lenValue).
    var len = o.length >>> 0;

    // 4. Si len és 0, retornem -1.
    if (len === 0) {
      return -1;
    }

    // 5. Si s'ha passat l'argument fromIndex n valdrà
    //    ToInteger(fromIndex); si no n valdrà 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

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

    // 7. Si n >= 0, k valdrà n.
    // 8. Si no, si n<0, k valdrà len - abs(n).
    //    Si k és menor que 0, llavors k valdrà 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repetir mentre k < len
    while (k < len) {
      // a. Sigui Pk ToString(k).
      //   Això és implícit per a operands a l'esquerra de l'operador in
      // b. Sigui kPresent el resultat de cridar el mètode intern
      //    HasProperty de o amb l'argument Pk.
      //   Aquest pas es pot combinar amb c
      // c. Si kPresent és cert, llavors
      //    i.  Sigui elementK el resultat de cridar el mètode intern Get
      //        de o amb l'argument ToString(k).
      //   ii.  Sigui same el resultat d'aplicar l'algoritme del 
      //         comparador d'igualtat estricta a
      //        searchElement i elementK.
      //  iii.  Si same és cert retornem k.
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

Especificacions

Especificació Estat Comentaris
ECMAScript 5.1 (ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Standard Definició inicial. Implementat a JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Standard  
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Array.prototype.indexOf' in that specification.
Draft  

Compatibilitat amb navegadors

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suport bàsic (Yes) 1.5 (1.8) 9 (Yes) (Yes)
Característica Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suport bàsic (Yes) (Yes) 1.0 (1.8) (Yes) (Yes) (Yes)

Notes de compatibilitat

  • Començant amb el Firefox 47 (Firefox 47 / Thunderbird 47 / SeaMonkey 2.44),  aquest mètode no retornarà -0. Per exemple, [0].indexOf(0, -0) ara sempre retornarà +0 (errada 1242043).

Vegeu també

Document Tags and Contributors

 Contributors to this page: enTropy
 Last updated by: enTropy,