Array.prototype.findIndex()
Метод findIndex()
(знайти індекс) примірників Array
повертає індекс першого елемента масиву, що задовольняє надану перевіркову функцію.
Якщо жоден елемент не задовольняє перевіркову функцію, повертається -1.
Дивіться також метод find()
, котрий повертає перший елемент, що задовольняє перевіркову функцію (а не його індекс).
Спробуйте його в дії
Синтаксис
findIndex(callbackFn)
findIndex(callbackFn, thisArg)
Параметри
callbackFn
(функція зворотного виклику)Функція для виконання на кожному елементі масиву. Повинна повернути істинне значення, аби показати, що шуканий елемент знайдено, а інакше – хибне. Ця функція викликається з наступними аргументами:
element
(елемент)Елемент масиву, що наразі обробляється.
index
(індекс)Індекс елемента масиву, що наразі обробляється.
array
(масив)Масив, на котрому викликали
findIndex()
.
thisArg
(аргументthis
) Необов'язковеЗначення для використання за
this
при виконанніcallbackFn
. Більше про це – в ітеративних методах.
Повернене значення
Індекс першого елемента масиву, що проходить перевірку. Інакше – -1
.
Опис
findIndex()
є ітеративним методом. Він викликає передану функцію callbackFn
один раз для кожного елемента масиву, в порядку зростання індексів, поки callbackFn
не поверне значення істинності. Тоді findIndex()
повертає індекс цього елемента – і зупиняє ітерацію масиву. Якщо callbackFn
взагалі не повертає значення істинності, то findIndex()
повертає -1
.
callbackFn
закликається для кожного індексу в масиві, а не лише тих, що мають присвоєні значення. Порожні комірки в розріджених масивах поводяться так само як undefined
.
findIndex()
не змінює масиву, на якому викликаний, але функція, передана за callbackFn
, може це робити. Проте зверніть увагу, що довжина масиву зберігається до першого заклику callbackFn
. Таким чином:
callbackFn
не обробить жодних елементів, доданих поза початковою довжиною масиву, актуальною на початок викликуfindIndex()
.- Зміни за вже обробленими індексами не призведуть до повторного заклику на них
callbackFn
. - Якщо наявний, іще не оброблений елемент масиву змінюється
callbackFn
, то його значення, передане вcallbackFn
, буде його значенням на ту мить, коли цей елемент обробляється. Видалені елементи обробляються так, ніби в нихundefined
.
Застереження: Паралельні зміни такого роду, як описано вище, часто призводять до важкого в розумінні коду, загалом їх слід уникати (окрім особливих випадків).
Метод findIndex()
є узагальненим. Він лишень очікує, що значення this
матиме властивість length
, а також властивості з цілочисловими ключами.
Приклади
Пошук в масиві індексу простого числа
Наступний приклад повертає індекс першого елемента масиву, що є простим числом, або -1
, якщо простого числа там немає.
function isPrime(element) {
if (element % 2 === 0 || element < 2) {
return false;
}
for (let factor = 3; factor <= Math.sqrt(element); factor += 2) {
if (element % factor === 0) {
return false;
}
}
return true;
}
console.log([4, 6, 8, 9, 12].findIndex(isPrime)); // -1, не знайдено
console.log([4, 6, 7, 9, 12].findIndex(isPrime)); // 2 (array[2] – це 7)
Використання findIndex() на розріджених масивах
Можна шукати в розрідженому масиві undefined
– і отримати індекс порожньої комірки.
console.log([1, , 3].findIndex((x) => x === undefined)); // 1
Виклик findIndex() на об'єктах-немасивах
Метод findIndex()
зчитує з this
властивість length
, а потім звертається до кожної цілочислової властивості, чий ключ є невід'ємним цілим числом, меншим за length.
const arrayLike = {
length: 3,
"-1": 0.1, // ігнорується findIndex(), оскільки -1 < 0
0: 2,
1: 7.3,
2: 4,
};
console.log(
Array.prototype.findIndex.call(arrayLike, (x) => !Number.isInteger(x)),
); // 1
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
findIndex
|
Chrome Full support 45 | Edge Full support 12 | Firefox Full support 25 | Internet Explorer No support No | Opera Full support 32 | Safari Full support 8 | WebView Android Full support 45 | Chrome Android Full support 45 | Firefox for Android Full support 4 | Opera Android Full support 32 | Safari on iOS Full support 8 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 4.0.0 |