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
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

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