--- title: Array.prototype.findIndex() slug: Web/JavaScript/Reference/Global_Objects/Array/findIndex tags: - Array - ECMAScript6 - JavaScript - Масив - метод translation_of: Web/JavaScript/Reference/Global_Objects/Array/findIndex ---
Метод findIndex()
повертає індекс першого елемента у масиві, який задовольняє надану перевірочну функцію. Інакше повертаєтсья -1, зазначаючи, що жодний елемент не пройшов перевірку.
Дивіться також метод {{jsxref("Array.find", "find()")}}, який повертає значення елемента масиву замість індексу.
arr.findIndex(callback(element[, index[, array]])[, thisArg])
callback
true
, зазначаючи, що відповідний елемент знайдений. Вона приймає три аргументи:
element
index
{{optional_inline}}array
{{optional_inline}}findIndex
.thisArg
{{optional_inline}}this
під час виконання callback
.Індекс першого елемента у масиві, який успішно пройшов перевірку. Інакше -1.
Метод findIndex
виконує функцію callback
один раз для кожного індексу 0..length-1
(включно) у масиві, поки не знайде той, для якого callback
поверне правдиве значення (таке, що приводиться до true
).
Якщо такий елемент знайдено, findIndex
негайно повертає його індекс. Якщо функція зворотного виклику так і не повертає правдиве значення (або довжина масиву length
дорівнює 0), findIndex
повертає -1. На відміну від інших методів масивів, таких як {{jsxref("Array.some")}}, callback
викликається навіть для індексів, що не мають значень.
callback
викликається з трьома аргументами:
Якщо параметр thisArg
передається до findIndex
, він буде використаний у якості this
всередині кожного виклику callback
. Якщо він не наданий, то використовується {{jsxref("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
, оскільки ви не зможете зробити їх не перелічуваними.
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ES2015', '#sec-array.prototype.findindex', 'Array.prototype.findIndex')}} | {{Spec2('ES2015')}} | Початкове визначення. |
{{SpecName('ESDraft', '#sec-array.prototype.findIndex', 'Array.prototype.findIndex')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Array.findIndex")}}