Learn JavaScript

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

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

По сути это почти тот же find(), только поиск идёт не слева направо, а справа налево.

Синтаксис

array.findLast(callback)
array.findLast(callback, thisArg)

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

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

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

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

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

console.log(result); // 130

Здесь метод вернул не 12, а 130, потому что поиск шёл с конца массива.

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

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

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

console.log(numbers.findLast((value) => value > 1));  // 3
console.log(numbers.findLast((value) => value > 10)); // undefined

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

Аргументы callback

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

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

Пример:

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

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

console.log(result); // "banana"

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

findLast() удобно использовать и с массивом объектов.

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

const user = users.findLast((item) => item.name === "Ivan");

console.log(user); // { id: 3, name: "Ivan" }

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

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

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

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

console.log(result); // 8

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

findLast() и find()

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

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

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

На вид результат одинаковый, но найден будет разный элемент:

  • find() вернёт первое совпадение слева
  • findLast() вернёт первое совпадение справа

Это особенно важно, если в массиве лежат объекты или разные значения с одинаковым условием.

findLast() и findLastIndex()

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

const lastError = logs.findLast((item) => item.level === "error");

console.log(lastError); // { level: "error" }

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

Думать, что findLast() возвращает массив

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

console.log(result); // 4

Это один элемент, а не [3, 4].

Путать findLast() и find()

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

console.log(numbers.find((value) => value === 2));     // 2
console.log(numbers.findLast((value) => value === 2)); // 2

Число одинаковое, но найдено оно в разных местах массива.

Забывать, что результат может быть undefined

const numbers = [1, 2, 3];

console.log(numbers.findLast((value) => value > 10)); // undefined

Это нормальное поведение, а не ошибка.

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

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

Коротко

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