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.