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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
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

Дивіться також