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 Latest Draft (ECMA-262)
The definition of 'Array.prototype.findIndex' in that specification.
Draft

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
findIndexChrome Full support 45Edge Full support 12Firefox Full support 25IE No support NoOpera Full support 32Safari Full support 8WebView Android Full support YesChrome Android Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support 8Samsung Internet Android Full support Yesnodejs Full support 4.0.0
Full support 4.0.0
Full support 0.12
Disabled
Disabled From version 0.12: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

Див. також