Learn JavaScript

findLastIndex() - метод для поиска индекса последнего подходящего элемента массива в JavaScript

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

Это почти тот же findIndex(), только поиск идёт не слева направо, а справа налево.

Синтаксис

array.findLastIndex(callback)
array.findLastIndex(callback, thisArg)

callback - функция, которая проверяет каждый элемент массива.

Что делает findLastIndex()

Метод проходит по массиву с конца к началу и вызывает callback для каждого элемента.

Если callback возвращает true, метод считает элемент найденным и возвращает его индекс.

const numbers = [5, 12, 8, 130];
const result = numbers.findLastIndex((value) => value > 10);

console.log(result); // 3

Здесь индекс 3, потому что поиск шёл с конца, и первым подходящим справа оказался 130.

Что возвращает findLastIndex()

findLastIndex() возвращает:

  • индекс последнего подходящего элемента, если он найден
  • -1, если ничего не найдено
const numbers = [1, 2, 3];

console.log(numbers.findLastIndex((value) => value > 1));  // 2
console.log(numbers.findLastIndex((value) => value > 10)); // -1

Это главное, что стоит запомнить про метод.

Аргументы callback

Callback в findLastIndex() может получать до трёх аргументов:

array.findLastIndex((element, index, array) => {
  // ...
});
  • element - текущий элемент
  • index - индекс текущего элемента
  • array - сам исходный массив

Пример:

const fruits = ["apple", "banana", "orange"];

const result = fruits.findLastIndex((fruit, index) => {
  return index < 2;
});

console.log(result); // 1

Поиск объекта по условию

findLastIndex() удобно использовать, когда нужно найти позицию последнего подходящего объекта.

const users = [
  { id: 1, name: "Anna" },
  { id: 2, name: "Ivan" },
  { id: 3, name: "Ivan" },
];

const index = users.findLastIndex((item) => item.name === "Ivan");

console.log(index); // 2

Это особенно полезно, если потом нужно обновить или удалить именно последнее совпадение.

findLastIndex() останавливается на первом совпадении справа

Как только найден подходящий элемент при движении с конца, поиск сразу прекращается.

const numbers = [2, 4, 6, 8];
const result = numbers.findLastIndex((value) => value > 3);

console.log(result); // 3

Хотя 6 и 4 тоже подходят, метод вернёт только индекс первого совпадения справа.

findLastIndex() и findLast()

Эти методы отличаются тем, что именно они возвращают.

const numbers = [10, 20, 30, 20];

console.log(numbers.findLast((value) => value === 20));      // 20
console.log(numbers.findLastIndex((value) => value === 20)); // 3

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

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

findLastIndex() и findIndex()

Эти методы отличаются направлением поиска.

const numbers = [10, 20, 30, 20];

console.log(numbers.findIndex((value) => value === 20));     // 1
console.log(numbers.findLastIndex((value) => value === 20)); // 3

findIndex() ищет слева направо.

findLastIndex() ищет справа налево.

findLastIndex() не меняет исходный массив

Метод только ищет индекс и не изменяет массив.

const numbers = [1, 2, 3];
const result = numbers.findLastIndex((value) => value === 2);

console.log(numbers); // [1, 2, 3]
console.log(result);  // 1

Пустые слоты

findLastIndex() проходит и по пустым слотам массива, где значение будет undefined.

const arr = Array(3);

const result = arr.findLastIndex((value) => value === undefined);

console.log(result); // 2

Это важно помнить при работе с массивами, созданными через Array(length).

Когда это полезно

findLastIndex() удобно использовать, когда:

  • нужен индекс последнего подходящего элемента
  • поиск нужно вести с конца массива
  • потом планируется обновление или удаление по найденному индексу

Пример:

const logs = [
  { level: "info" },
  { level: "error" },
  { level: "info" },
  { level: "error" },
];

const index = logs.findLastIndex((item) => item.level === "error");

console.log(index); // 3

Частые ошибки

Думать, что findLastIndex() возвращает элемент

const numbers = [1, 2, 3, 4];
const result = numbers.findLastIndex((value) => value > 2);

console.log(result); // 3

Это индекс, а не значение 4.

Путать findLastIndex() и findIndex()

const numbers = [1, 2, 3, 2];

console.log(numbers.findIndex((value) => value === 2));     // 1
console.log(numbers.findLastIndex((value) => value === 2)); // 3

Здесь разница именно в направлении поиска.

Забывать, что при отсутствии результата будет -1

const numbers = [1, 2, 3];

console.log(numbers.findLastIndex((value) => value > 10)); // -1

Это нормальный результат, а не ошибка.

Быстрая памятка

  • findLastIndex() возвращает индекс последнего элемента, подходящего под условие
  • поиск идёт справа налево
  • если ничего не найдено, метод вернёт -1
  • callback может получать element, index и array
  • findLast() возвращает элемент, а findLastIndex() - индекс

Коротко

findLastIndex() - это удобный способ найти индекс последнего подходящего элемента массива. Главное, что стоит запомнить: метод ищет с конца и возвращает именно индекс, а не сам элемент.