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 |