Array.prototype.findIndex()

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臋 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 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

Kompatybilno艣膰 przegl膮darek

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
Feature Chrome Edge Firefox (Gecko) Internet Explorer Edge Opera Safari
Basic support 45.0 (Yes) 25.0 (25.0) No support Tak Tak 7.1
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support No support 45.0 (Yes) 25.0 (25.0) No support No support 8.0

Zobacz tak偶e