Array.findIndex() в JavaScript — індекс першого елемента за умовою


Опис

Метод findIndex() надає інструмент для знаходження індексу першого елемента в масиві, який відповідає певній умові. Для цього в нього передається callback-функція. Ця функція має повертати true або false для кожного елемента, залежно від його відповідності заданій умові. Перший елемент, для якого callback-функція поверне true, визначає результат виконання методу findIndex().

Сам метод findIndex() не змінює масив, на якому його викликали. Але важливо пам'ятати, що функція, передана як callbackFn, може вносити зміни в цей масив. При цьому:

  • callbackFn не буде працювати з елементами, доданими після початку роботи методу findIndex().
  • Індекси, які вже були оброблені, при змінах в них не будуть повторно оброблятися callbackFn.
  • Якщо елемент масиву, що ще не був оброблений, зміниться в процесі роботи callbackFn, його значення буде відповідати стану на момент його обробки. Елементи, які були видалені, опрацьовуються як undefined.

Приклад:

let numbers = [5, 12, 8, 130, 44];
let isLargeNumber = (element) => element > 13;
let index = numbers.findIndex(isLargeNumber);
console.log(index); // повертає 3

У цьому прикладі ми шукаємо перший елемент у масиві numbers, який більший ніж 13. Як результат роботи методу ми отримуємо значення 3, бо елемент під індексом 3 (130) є першим, який відповідає умові "більше ніж 13".

автор: Bond

Загальний опис

автор: NagarD

Нотатка

Якщо немає елементів, що відповідають умові, метод findIndex() поверне -1. Тому важливо перевіряти результат методу на -1, щоб уникнути помилок.

автор: Bond
Нотатка

Метод findIndex() універсальний. Він передбачає, що значення this має властивість length та інші властивості з цілими числовими ключами.

автор: Bond

Синтаксис

findIndex(callbackFn)
findIndex(callbackFn, thisArg)

Параметри

callbackFn

Функція, яка виконується для кожного елемента масиву. Вона повинна повертати значення істиності (truthy), щоб показати, що був знайдений відповідний елемент, і значення хибності (falsy) у протилежному випадку.

Функція callbackFn викликається з наступними аргументами:

  • element: поточний елемент, який обробляється у масиві;
  • index: індекс поточного елемента, який обробляється у масиві;
  • array: масив, на якому було викликано метод findIndex().
автор: Bond

thisArg

Значення, яке використовується як this під час виконання функції callbackFn.

автор: Bond

Повернення

index

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

автор: Bond

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
45 25 8 32 12
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
45 45 4 8
Підтримка: серверні переглядачі
Переглядач Node.js Deno
4.0.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

Приклад повертає індекс першого елемента в масиві, який є простим числом, або -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)
автор: Bond

Використання findIndex() на розріджених масивах. Ви можете шукати undefined у розрідженому масиві та отримати індекс порожнього слоту.

console.log([1, , 3].findIndex((x) => x === undefined)); // 1
автор: Bond

Приклад використовує метод findIndex() для знаходження індексу першого елемента в масиві, яке є числом більшим за 13. Результат виводиться на сторінку.

HTML

<header>
  <h2 class="title">Знаходження індексу першого числа більшого за 13 в масиві</h2>
  <p class="description">Цей приклад використовує метод findIndex() для знаходження індексу першого елемента в масиві, яке є числом більшим за 13.</p>
</header>
<main>
  <div>
    <p>Масив: [5, 12, 8, 130, 44]</p>
    <p>Результат: <span id="result"></span></p>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

main div {
  padding: 10px;
  border: 1px solid #ccc;
  margin-bottom: 10px;
}

main p {
  margin: 0;
}

JS

const array1 = [5, 12, 8, 130, 44];

const isLargeNumber = element => element > 13;

document.getElementById('result').textContent = array1.findIndex(isLargeNumber);
//# sourceURL=pen.js
автор: Bond

Що findIndex() повертає, коли нічого не знайдено, і чому знайдений індекс 0 виглядає як «не знайдено».

const users = [
  { id: 7, name: 'Оля' },
  { id: 3, name: 'Іван' },
];

console.log(users.findIndex((u) => u.id === 3));  // 1
console.log(users.findIndex((u) => u.id === 99)); // -1, а не undefined

// пастка: збіг на нульовій позиції
const i = users.findIndex((u) => u.id === 7);
console.log(i, Boolean(i));   // 0 false — if (i) вирішить, що не знайдено
console.log(i !== -1);        // true — ось так правильно

// а для «не знайдено» та сама умова істинна
console.log(Boolean(users.findIndex((u) => u.id === 99))); // true, бо -1

// indexOf порівнює значення, findIndex — умову
console.log(users.indexOf({ id: 7, name: 'Оля' }));       // -1 — інший об'єкт
console.log([NaN].indexOf(NaN), [NaN].findIndex(Number.isNaN)); // -1 0

// порожні комірки findIndex усе ж відвідує
console.log([, , 5].findIndex((v) => v === undefined));   // 0
автор: NagarD

Метод findIndex() зчитує властивість 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
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід