Array.prototype.findIndex()

Questa traduzione è incompleta. Aiutaci a tradurre questo articolo dall’inglese

Il metodo findIndex() restituisce l'indice del primo elemento nell'array che soddisfa la funzione di testing fornita. Altrimenti, restituisce -1, indicando che nessun elemento ha superato il test.

Guarda anche il metodo find(), che restituisce il valore dell'elemento anziché il suo indice.

Sintassi

arr.findIndex(callback( elemento[,indice[, array]] )[, thisArg])

Parametri

callback

Una funzione da eseguire su ognuno dei valori finché la funzione non resitituisce true, indicando che l'elemento che soddisfa la condizione è stato trovato.

Prende in input tre argomenti:

elemento
L'elemento dell'array che viene processato.
indice Optional
L'indice dell'elemento dell'array che viene processato.
array Optional
L'array su cui è stato chiamato findIndex().
thisArg Optional
Oggetto da usare come this quando viene eseguita la callback.

Valore restituito

L'indice dell primo elemento dell'array che supera il test. Altrimenti -1.

Descrizione

Il metodo findIndex() esegue la callback una volta per ogni indice nell'array finché non trova quello per cui la callback ritorna un valore truthy.

Se l'elemento viene trovato, findIndex()  restitutisce immediatamente l'idice dell'elemento. Se callback non restituisce mai un valore truthy (o la length dell'array è 0), findIndex() restituisce -1.

Caso limite: A differenza di altri metodi per array come Array.some(), callback viene eseguita anche per gli indici con valori non assegnati.

callback è invocata con tre argomenti:

  1. Il valore dell'elemento
  2. L'indice dell'elemento
  3. L'oggetto Array che viene percorso

Se viene passato a findIndex() un parametro thisArg, sarà usato come this in ogni invocazione di callback. Se non viene passato si usa undefined.

The range of elements processed by findIndex() is set before the first invocation of callback. callback will not process the elements appended to the array after the call to findIndex() begins. If an existing, unvisited element of the array is changed by callback, its value passed to the callback will be the value at the time findIndex() visits the element's index.

Elements that are deleted are still visited.

Polyfill

// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
if (!Array.prototype.findIndex) {
  Object.defineProperty(Array.prototype, 'findIndex', {
    value: function(predicate) {
     // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If IsCallable(predicate) is false, throw a TypeError exception.
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }

      // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
      var thisArg = arguments[1];

      // 5. Let k be 0.
      var k = 0;

      // 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return k.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return k;
        }
        // e. Increase k by 1.
        k++;
      }

      // 7. Return -1.
      return -1;
    },
    configurable: true,
    writable: true
  });
}

If you need to support truly obsolete JavaScript engines that do not support Object.defineProperty, it is best not to polyfill Array.prototype methods at all, as you cannot make them non-enumerable.

Examples

Find the index of a prime number in an array

The following example returns the index of the first element in the array that is a prime number, or -1 if there is no prime number.

function isPrime(num) {
  for (let i = 2; num > i; i++) {
    if (num % i == 0) {
      return false;
    }
  }
  return num > 1;
}

console.log([4, 6, 8, 9, 12].findIndex(isPrime)); // -1, not found
console.log([4, 6, 7, 9, 12].findIndex(isPrime)); // 2 (array[2] is 7)

Find index using arrow function

The following example finds the index of a fruit using an arrow function:

const fruits = ["apple", "banana", "cantaloupe", "blueberries", "grapefruit"];

const index = fruits.findIndex(fruit => fruit === "blueberries");

console.log(index); // 3
console.log(fruits[index]); // blueberries

Specifications

Specification
ECMAScript (ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.

Browser compatibility

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
findIndexChrome Full support 45Edge Full support 12Firefox Full support 25IE No support NoOpera Full support 32Safari Full support 8WebView Android Full support 45Chrome Android Full support 45Firefox Android Full support 4Opera Android Full support 32Safari iOS Full support 8Samsung Internet Android Full support 5.0nodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

See also