findIndex() в JavaScript

findIndex() - это метод массива, который возвращает индекс первого элемента, подходящего под условие.

let numbers = [5, 12, 8, 20];

let index = numbers.findIndex((number) => number > 10);

console.log(index); // 1

Число 12 находится на индексе 1, поэтому метод вернул 1.

Синтаксис

В findIndex() передается callback-функция. Она вызывается для элементов массива по порядку.

let index = array.findIndex((element) => {
  return condition;
});

Если callback-функция возвращает true, метод возвращает индекс текущего элемента и прекращает поиск.

let prices = [500, 1200, 800, 3000];

let index = prices.findIndex((price) => {
  return price > 1000;
});

console.log(index); // 1

Как работает findIndex()

findIndex() нужен, когда важен не сам элемент, а его позиция в массиве.

let names = ['Анна', 'Олег', 'Мария'];

let index = names.findIndex((name) => name === 'Олег');

console.log(index); // 1

Такой индекс можно использовать, например, чтобы заменить элемент.

if (index !== -1) {
  names[index] = 'Игорь';
}

console.log(names); // ['Анна', 'Игорь', 'Мария']

Поиск индекса объекта

Метод хорошо подходит для массивов объектов, когда нужно найти позицию объекта по свойству.

let users = [
  { id: 1, name: 'Анна' },
  { id: 2, name: 'Олег' },
  { id: 3, name: 'Мария' },
];

let index = users.findIndex((user) => user.id === 2);

console.log(index); // 1

Обычный indexOf() для такой задачи не подойдет, потому что он ищет точное значение, а не проверяет свойства объекта.

Если элемент не найден

Если подходящего элемента нет, findIndex() вернет -1.

let users = [
  { id: 1, name: 'Анна' },
  { id: 2, name: 'Олег' },
];

let index = users.findIndex((user) => user.id === 10);

console.log(index); // -1

Поэтому результат обычно сравнивают с -1.

if (index !== -1) {
  console.log('Пользователь найден');
}

Не стоит проверять индекс просто через if (index). Если элемент находится на индексе 0, такое условие не сработает.

Параметры callback-функции

Callback-функция в findIndex() может принимать три параметра.

element - текущий элемент массива.

index - индекс текущего элемента.

array - исходный массив.

let numbers = [10, 20, 30, 40];

let index = numbers.findIndex((number, index) => {
  return index > 1 && number > 20;
});

console.log(index); // 2

Чаще всего достаточно первого параметра. Индекс используют, когда условие зависит от позиции элемента.

Отличие findIndex() от find() и indexOf()

findIndex() возвращает индекс первого элемента, который подошел под условие.

find() возвращает сам элемент.

indexOf() ищет точное значение и возвращает его индекс.

let users = [
  { id: 1, name: 'Анна' },
  { id: 2, name: 'Олег' },
];

let user = users.find((user) => user.id === 2);
let index = users.findIndex((user) => user.id === 2);

Если нужен объект - используйте find(). Если нужен его индекс - findIndex().