Array.prototype.findIndex()

Метод findIndex() повертає індекс першого елемента у масиві, який задовольняє надану перевірочну функцію. Інакше повертаєтсья -1, зазначаючи, що жодний елемент не пройшов перевірку.

Дивіться також метод find(), який повертає значення елемента масиву замість індексу.

Синтаксис

arr.findIndex(callback(element[, index[, array]])[, thisArg])

Параметри

callback
Функція, яка виконується на кожному значенні масиву, поки не поверне true, зазначаючи, що відповідний елемент знайдений. Вона приймає три аргументи:
element
Поточний елемент масиву, який обробляється.
indexOptional
Індекс поточного елементу, що обробляється.
arrayOptional
Масив, для якого був викликаний метод findIndex.
thisArgOptional
Необов'язковий об'єкт для використання у якості this під час виконання callback.

Значення, що повертається

Індекс першого елемента у масиві, який успішно пройшов перевірку. Інакше -1.

Опис

Метод findIndex виконує функцію callback один раз для кожного індексу 0..length-1 (включно) у масиві, поки не знайде той, для якого callback поверне правдиве значення (таке, що приводиться до true).

Якщо такий елемент знайдено, findIndex негайно повертає його індекс. Якщо функція зворотного виклику так і не повертає правдиве значення (або довжина масиву length дорівнює 0), findIndex повертає -1. На відміну від інших методів масивів, таких як Array.some, callback викликається навіть для індексів, що не мають значень.

callback викликається з трьома аргументами:

  1. Значення елемента
  2. Індекс елемента
  3. Об'єкт Array, який перебирається

Якщо параметр thisArg передається до findIndex, він буде використаний у якості this всередині кожного виклику callback. Якщо він не наданий, то використовується undefined.

Діапазон елементів, які опрацьовує findIndex, встановлюється до першого виклику callback. callback не обробляє елементи, додані до масиву після того, як почалося виконання findIndex. Якщо існуючий, ще не опрацьований елемент масиву змінюється функцією callback, його значення, що передається до callback буде значенням на той момент, коли findIndex доходить до індексу цього елементу. Видалені елементи все одно опрацьовуються.

Приклади

Знайти індекс простого числа у масиві

Наступний приклад повертає індекс першого елементу у масиві, який є простим числом, або -1, якщо там нема жодного простого числа.

function isPrime(element, index, array) {
  var start = 2;
  while (start <= Math.sqrt(element)) {
    if (element % start < 1) {
      return false;
    } else {
      start++;
    }
  }
  return element > 2;
}

console.log([4, 6, 8, 12].findIndex(isPrime)); // -1, не знайдено
console.log([4, 6, 7, 12].findIndex(isPrime)); // 2 (array[2] дорівнює 7)

Знайти індекс, використувуючи стрілочну функцію

Наступний приклад знаходить індекс фрукта, використувуючи стрілочну функцію:

const fruits = ["яблуко", "банан", "диня", "чорниці", "грейпфрут"];

const index = fruits.findIndex(fruit => fruit === "чорниці");

console.log(index); // 3
console.log(fruits[index]); // чорниці

Поліфіл

// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
if (!Array.prototype.findIndex) {
  Object.defineProperty(Array.prototype, 'findIndex', {
    value: function(predicate) {
     // 1. Нехай O дорівнює ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Нехай len дорівнює ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. Якщо IsCallable(predicate) дорівнює false, викинути виняток TypeError.
      if (typeof predicate !== 'function') {
        throw new TypeError('предикат має бути функцією');
      }

      // 4. Якщо наданий thisArg, нехай T дорівнює thisArg; інакше нехай T дорівнює undefined.
      var thisArg = arguments[1];

      // 5. Нехай k дорівнює 0.
      var k = 0;

      // 6. Повторювати, поки k < len
      while (k < len) {
        // a. Нехай Pk дорівнює ! ToString(k).
        // b. Нехай kValue дорівнює ? Get(O, Pk).
        // c. Нехай testResult дорівнює ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. Якщо testResult дорівнює true, повернути k.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return k;
        }
        // e. Збільшити k на 1.
        k++;
      }

      // 7. Повернути -1.
      return -1;
    },
    configurable: true,
    writable: true
  });
}

Якщо вам потрібно підтримувати зовсім застарілі рушії JavaScript, які не підтримують Object.defineProperty, краще взагалі не використовувати поліфіли методів Array.prototype, оскільки ви не зможете зробити їх не перелічуваними.

Специфікації

Специфікація Статус Коментар
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.
Standard Початкове визначення.
ECMAScript (ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.
Living Standard

Сумісність з веб-переглядачами

BCD tables only load in the browser

Див. також