findLast() и findLastIndex() — маленькая революция в массивах

Показываем на реальных примерах, почему новые методы массивов заменяют старые костыли с reverse(). Коротко, наглядно и без мутаций.

Разработка

6 мин

JavaScript умеет удивлять даже в 2025 году. Казалось бы, у нас уже есть всё для работы с массивами: map, filter, find, reduce… Но недавно появились новые методы — findLast() и findLastIndex(). И это не просто косметика, а настоящая маленькая революция.

Зачем нужны новые методы?

До недавнего времени, если нам нужно было найти последний элемент массива, удовлетворяющий условию, приходилось идти в обход:

  • Перевернуть массив через reverse() и применить find().

  • Или пройтись циклом с конца.

Минусы очевидны:

  • reverse() мутирует массив — опасно и неочевидно.

  • Цикл — громоздко и не в духе современного JavaScript.

Что изменилось

Теперь всё проще:

  • findLast() ищет последний элемент, подходящий под условие.

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


const users = [
  { name: "Аня", active: false },
  { name: "Борис", active: true },
  { name: "Вика", active: false },
  { name: "Гоша", active: true }
];

console.log(users.findLast(user => user.active));
// { name: "Гоша", active: true }

console.log(users.findLastIndex(user => user.active));
// 3
    

Почему это лучше старых трюков?

  • Код читается как текст — не нужно угадывать замысел.

  • Безопасность — нет мутаций массива.

  • Скорость — интерпретатор идёт с конца и останавливается на первом совпадении.

«До/после»: примеры

Задача

Было (раньше)

Стало (сейчас)

Последний активный пользователь


const lastActive = users
  .slice()
  .reverse()
  .find(u => u.active);
          

const lastActive = users.findLast(u => u.active);
          

Индекс последней ошибки


const i = logs.length - 1 - logs
  .slice()
  .reverse()
  .findIndex(e => e.level === "error");
          

const i = logs.findLastIndex(e => e.level === "error");
          

Последний чётный элемент


let last;
for (let i = arr.length - 1; i >= 0; i--) {
  if (arr[i] % 2 === 0) { last = arr[i]; break; }
}
          

const last = arr.findLast(n => n % 2 === 0);
          

Частые вопросы

  • Что возвращают? findLast() — элемент или undefined. findLastIndex() — индекс или -1.

  • Про производительность: проходит массив один раз с конца, без разворота и копий.

  • TypeScript: сигнатуры аналогичны find/findIndex, переход минимален.

Вывод

findLast() и findLastIndex() — это практичная замена костыльным паттернам с reverse() и ручными циклами. Код становится короче, безопаснее и очевиднее.

🙌 Все эти фишки и новинки мы обсуждаем в нашем уютном Telegram-канал, где мы делимся новостями из мира разработки, разбираем новые инструменты и шутим про жизнь программистов. Присоединяйся — будет интересно!

Комментарии