--- 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])
callbacktrue, зазначаючи, що відповідний елемент знайдений. Вона приймає три аргументи:
elementindex{{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")}}