Learn JavaScript

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

lastIndexOf() ищет значение в массиве и возвращает индекс последнего совпадения.

Поиск идёт с конца массива к началу, но результатом всё равно будет обычный индекс элемента.

Синтаксис

array.lastIndexOf(value)
array.lastIndexOf(value, fromIndex)

value - значение, которое нужно найти.

fromIndex - позиция, с которой начинать поиск в обратную сторону.

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

Метод проходит по массиву справа налево и ищет последнее совпадение.

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

console.log(numbers.lastIndexOf(20)); // 3
console.log(numbers.lastIndexOf(50)); // -1

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

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

  • индекс последнего найденного элемента
  • -1, если ничего не найдено
const fruits = ["apple", "banana", "orange", "banana"];

console.log(fruits.lastIndexOf("banana")); // 3
console.log(fruits.lastIndexOf("grape"));  // -1

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

Поиск с fromIndex

Вторым аргументом можно ограничить поиск и сказать, с какого индекса идти влево.

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

console.log(numbers.lastIndexOf(2, 2)); // 1
console.log(numbers.lastIndexOf(1, 2)); // 0

Здесь поиск начинается с индекса 2 и идёт к началу массива.

Отрицательный fromIndex

fromIndex может быть отрицательным.

В этом случае отсчёт идёт с конца массива.

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

console.log(numbers.lastIndexOf(2, -2)); // 3
console.log(numbers.lastIndexOf(3, -2)); // 2

Это удобно, когда нужно искать только в правой части массива.

lastIndexOf() и indexOf()

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

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

console.log(numbers.indexOf(20));     // 1
console.log(numbers.lastIndexOf(20)); // 3

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

lastIndexOf() ищет первое совпадение справа.

lastIndexOf() и includes()

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

includes() возвращает только true или false.

const numbers = [10, 20, 30];

console.log(numbers.lastIndexOf(20)); // 1
console.log(numbers.includes(20));    // true

Если нужна просто проверка наличия, includes() обычно читается проще.

Объекты сравниваются по ссылке

Если в массиве лежат объекты, lastIndexOf() сравнивает не содержимое, а ссылку.

const user = { id: 1 };
const users = [{ id: 1 }, user, user];

console.log(users.lastIndexOf(user));      // 2
console.log(users.lastIndexOf({ id: 1 })); // -1

На вид объекты одинаковые, но это разные ссылки.

lastIndexOf() не находит NaN

Это важный нюанс.

const values = [1, 2, NaN];

console.log(values.lastIndexOf(NaN)); // -1
console.log(values.includes(NaN));    // true

Если нужно проверить наличие NaN, удобнее использовать includes().

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

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

const numbers = [1, 2, 3];
const result = numbers.lastIndexOf(2);

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

Пустые слоты

lastIndexOf() пропускает пустые слоты массива.

const arr = Array(3);

console.log(arr.lastIndexOf(undefined)); // -1

Это отличается от includes(), который в похожей ситуации может вернуть true.

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

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

  • нужен индекс последнего совпадения
  • в массиве значение может встречаться несколько раз
  • требуется точное совпадение, а не поиск по условию

Пример:

const history = ["open", "save", "open", "close"];
const lastOpenIndex = history.lastIndexOf("open");

console.log(lastOpenIndex); // 2

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

Думать, что lastIndexOf() возвращает true или false

const numbers = [1, 2, 3];
const result = numbers.lastIndexOf(2);

console.log(result); // 1

Если нужен булев результат, обычно удобнее includes().

Писать проверку через if (lastIndexOf(…))

const numbers = [10, 20, 30];

if (numbers.lastIndexOf(10)) {
  console.log("Найдено");
}

Это ошибка, потому что индекс 0 является falsy.

Правильно так:

if (numbers.lastIndexOf(10) !== -1) {
  console.log("Найдено");
}

Сравнивать объекты по содержимому

const items = [{ id: 1 }];

console.log(items.lastIndexOf({ id: 1 })); // -1

Для объектов сравнение идёт по ссылке.

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

  • lastIndexOf() возвращает индекс последнего найденного элемента
  • поиск идёт справа налево
  • если ничего не найдено, метод вернёт -1
  • можно задать стартовую позицию через fromIndex
  • lastIndexOf() не находит NaN

Коротко

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