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() є узагальненим. Він лишень очікує, що значення 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)
Використання третього аргументу callbackFn
Аргумент array корисний тоді, коли є потреба звернутися до іншого елемента масиву, особливо коли немає змінної, що посилається на цей масив. У наступному прикладі спочатку використовується filter() для видобування додатних значень, а потім findIndex() – для пошуку першого елемента, що менший за своїх сусідів.
const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const firstTrough = numbers
.filter((num) => num > 0)
.findIndex((num, idx, arr) => {
// Без аргументу arr немає способу легко отримати доступ до проміжного масиву без збереження його в змінній.
if (idx > 0 && num >= arr[idx - 1]) return false;
if (idx < arr.length - 1 && num >= arr[idx + 1]) return false;
return true;
});
console.log(firstTrough); // 1
Використання 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 Ні | 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 |