--- title: Array.prototype.findIndex() slug: Web/JavaScript/Reference/Global_Objects/Array/findIndex translation_of: Web/JavaScript/Reference/Global_Objects/Array/findIndex original_slug: Web/JavaScript/Referencje/Obiekty/Array/findIndex ---
{{JSRef}}

Metoda findIndex() zwraca indeks pierwszego elementu tablicy, który spełnia kryteria postawione w funkcji testującej. W przeciwnym wypadku zwraca -1.

function isBigEnough(element) {
  return element >= 15;
}

[12, 5, 8, 130, 44].findIndex(isBigEnough);
// zostanie zwrócony indeks czwartego elementu tablicy,
// który wynosi 3

Zobacz także metodę {{jsxref("Array.find", "find()")}}, która zwraca wartość znalezionego elementu, zamiast jego indeksu.

Składnia

arr.findIndex(callback[, thisArg])

Parametry

callback
Funkcja wywoływana dla każdej wartości w tablicy, bierze trzy argumenty:
element
Obecnie przetwarzany element z tablicy.
index
Indeks obecnie przetwarzanego elementu z tablicy.
array
Tablica, na której została wywołana funkcja findIndex.
thisArg
Opcjonalny.  Obiekt do użycia jako this w czasie wykonywania callback.

Zwracana wartość

Indeks elementu tablicy, który pomyślnie przeszedł test, jeśli taki nie zostanie znaleziony, zwraca -1.

Opis

Metoda findIndex wykonuje funkcję callback dla każdego indeksu tablicy 0..długość - 1 (włącznie) w tablicy dopóki nie znajdzie tego, na którym funkcja callback zwróci prawdę. Jeśli taki element zostanie znaleziony, findIndex natychmiast zwraca indeks dla tej iteracji. Jeśli callback nigdy nie zwróci prawdy lub wielkość tablicy wynosi 0, findIndex zwróci -1. W przeciwieństwie do innych metod tablicowych takich jak Array#some, w tablicach rzadkich callback jest wywoływany nawet dla indeksów niewystępujących w tablicy.

callback jest wywoływany z trzema argumentami: wartością elementu, indeksem elementu i przetwarzaną tablicą.

Jeśli thisArg jest dołączony do findIndex, zostanie użyty jako this dla każdego wywołania . Jeśli nie, zostanie użyte {{jsxref("undefined")}}.

findIndex nie zmienia tablicy na której jest wywoływany.

Zakres elementów przetwarzanych przez findIndex jest ustawiany przed pierwszym wywołaniem funkcji callback. Elementy, które są dodane po rozpoczęciu wywołania funkcji findIndex nie będą przetworzone przez callback. Jeśli istniejący, nieodwiedzony element tablicy zostanie zmieniony przez callback, jego wartość przekazana do odwiedzającego callback będzie tą wartością z momentu, w którym findIndex odwiedzi indeks tego elementu, elementy usunięte, nie będą odwiedzone.

Przykłady

Znajdź indeks liczby pierwszej w tablicy

Poniższy przykład znajduje indeks elementu w tablicy, który jest liczbą pierwszą (lub zwraca -1 jeśli nie w tablicy nie ma liczby pierwszej).

function isPrime(element, index, array) {
  var start = 2;
  while (start <= Math.sqrt(element)) {
    if (element % start++ < 1) {
      return false;
    }
  }
  return element > 1;
}

console.log([4, 6, 8, 12].findIndex(isPrime)); // -1, nie znaleziono
console.log([4, 6, 7, 12].findIndex(isPrime)); // 2

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" ma wartość null lub undefined');
      }

      var o = Object(this);

      // 2. Niech len będzie ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. Jeśli IsCallable(predicate) jest fałszem, rzuć wyjątek TypeError.
      if (typeof predicate !== 'function') {
        throw new TypeError('predykat musi być funkcją');
      }

      // 4. Jeśli thisArg został podany, niech T będzie thisArg; w przeciwnym wypadku, niech T będzie undefined.
      var thisArg = arguments[1];

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

      // 6. Powtarzaj, dopóki k < len
      while (k < len) {
        // a. Niech Pk będzie ! ToString(k).
        // b. Niech kValue będzie ? Get(O, Pk).
        // c. Niech testResult będzie ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. Jeśli testResult jest prawdą, zwróć k.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return k;
        }
        // e. Zwiększ wartość k o 1.
        k++;
      }

      // 7. Return -1.
      return -1;
    }
  });
}

Jeśli musisz wspierać naprawdę przestarzałe silniki JavaScript, które nie wspierają Object.defineProperty, najlepiej nie korzystać z metod Array.prototype  w ogóle, ponieważ nie można sprawić by były niepoliczalne.

Specyfikacje

Specification Status Komentarz
{{SpecName('ES2015', '#sec-array.prototype.findindex', 'Array.prototype.findIndex')}} {{Spec2('ES2015')}} Podstawowa definicja.
{{SpecName('ESDraft', '#sec-array.prototype.findIndex', 'Array.prototype.findIndex')}} {{Spec2('ESDraft')}}  

Kompatybilność przeglądarek

{{CompatibilityTable}}
Feature Chrome Edge Firefox (Gecko) Internet Explorer Edge Opera Safari
Basic support {{CompatChrome(45.0)}} {{CompatVersionUnknown}} {{CompatGeckoDesktop("25.0")}} {{CompatNo}} Tak Tak {{CompatSafari("7.1")}}
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatNo}} 45.0 {{CompatVersionUnknown}} {{CompatGeckoMobile("25.0")}} {{CompatNo}} {{CompatNo}} 8.0

Zobacz także