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 wykonywaniacallback.
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
Specification | Status | Komentarz |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Array.prototype.findIndex' in that specification. |
Standard | Podstawowa definicja. |
ECMAScript (ECMA-262) The definition of 'Array.prototype.findIndex' in that specification. |
Living Standard |
Kompatybilność przeglądarek
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 |