Spec-Zone.ru › JavaScript

Array.prototype.findLast()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с августа 2022 года.

Метод findLast() экземпляров Array перебирает массив в обратном порядке и возвращает значение первого элемента, удовлетворяющего предоставленной тестовой функции. Если ни один элемент не удовлетворяет тестовой функции, возвращается undefined.

Если вам нужно найти:

  • первый соответствующий элемент, используйте find().
  • индекс последнего соответствующего элемента в массиве, используйте findLastIndex().
  • индекс значения, используйте indexOf(). (Он похож на findIndex(), но проверяет каждый элемент на равенство со значением вместо использования тестовой функции.)
  • существует ли значение в массиве, используйте includes(). Опять же, он проверяет каждый элемент на равенство со значением вместо использования тестовой функции.
  • удовлетворяет ли какой-либо элемент предоставленной тестовой функции, используйте some().

Попробуйте

const array = [5, 12, 50, 130, 44];

const found = array.findLast((element) => element > 45);

console.log(found);
// Expected output: 130

Синтаксис

findLast(callbackFn)
findLast(callbackFn, thisArg)

Параметры

callbackFn
Функция, которая будет выполняться для каждого элемента в массиве. Она должна возвращать истинное значение, чтобы указать, что найден соответствующий элемент, и ложное значение в противном случае. Функция вызывается со следующими аргументами:
element
Текущий элемент, обрабатываемый в массиве.
index
Индекс текущего элемента, обрабатываемого в массиве.
array
Массив, к которому был применен метод findLast().
thisArg Необязательный
Значение, которое будет использоваться в качестве this при выполнении callbackFn. См. итеративные методы.

Возвращаемое значение

Последний (с наибольшим индексом) элемент в массиве, который удовлетворяет предоставленной тестовой функции; undefined, если соответствующий элемент не найден.

Описание

Метод findLast() является итеративным методом. Он вызывает предоставленную функцию callbackFn один раз для каждого элемента в массиве в порядке убывания индексов, до тех пор, пока callbackFn не вернет истинное значение. Затем findLast() возвращает этот элемент и прекращает итерацию по массиву. Если callbackFn никогда не возвращает истинное значение, findLast() возвращает undefined. Прочтите раздел итеративные методы, чтобы узнать больше о том, как эти методы работают в целом.

callbackFn вызывается для каждого индекса массива, а не только для тех, у которых есть назначенные значения. Пустые слоты в разреженных массивах обрабатываются так же, как undefined.

Метод findLast() является общим. Он только ожидает, что значение this будет иметь свойство length и целочисленные свойства.

Примеры

Поиск последнего объекта в массиве, соответствующего свойствам элемента

Этот пример показывает, как можно создать тест на основе свойств элементов массива.

const inventory = [
  { name: "apples", quantity: 2 },
  { name: "bananas", quantity: 0 },
  { name: "fish", quantity: 1 },
  { name: "cherries", quantity: 5 },
];

// return true inventory stock is low
function isNotEnough(item) {
  return item.quantity < 2;
}

console.log(inventory.findLast(isNotEnough));
// { name: "fish", quantity: 1 }

Использование стрелочной функции и деструктуризации

Предыдущий пример может быть записан с использованием стрелочной функции и деструктуризации объектов:

const inventory = [
  { name: "apples", quantity: 2 },
  { name: "bananas", quantity: 0 },
  { name: "fish", quantity: 1 },
  { name: "cherries", quantity: 5 },
];

const result = inventory.findLast(({ quantity }) => quantity < 2);

console.log(result);
// { name: "fish", quantity: 1 }

Поиск последнего простого числа в массиве

Следующий пример возвращает последний элемент в массиве, который является простым числом, или undefined, если простого числа нет.

function isPrime(n) {
  if (n < 2) {
    return false;
  }
  if (n % 2 === 0) {
    return n === 2;
  }
  for (let factor = 3; factor * factor <= n; factor += 2) {
    if (n % factor === 0) {
      return false;
    }
  }
  return true;
}

console.log([4, 6, 8, 12].findLast(isPrime)); // undefined, not found
console.log([4, 5, 7, 8, 9, 11, 12].findLast(isPrime)); // 11

Примечание: Реализация isPrime() предназначена только для демонстрации. Для реального приложения вам следует использовать сильно мемоизированный алгоритм, такой как решето Эратосфена, чтобы избежать повторных вычислений.

Поиск самой последней завершенной задачи

Этот пример демонстрирует практический случай использования findLast() при работе с данными, упорядоченными по времени. Он находит самую последнюю завершенную задачу из списка, уже отсортированного по timestamp.

const tasks = [
  { name: "Setup project", completed: true, timestamp: 1609459200000 },
  { name: "Write tests", completed: false, timestamp: 1609545600000 },
  { name: "Fix bug #42", completed: true, timestamp: 1609632000000 },
  { name: "Deploy to staging", completed: true, timestamp: 1609718400000 },
  { name: "Review PR", completed: false, timestamp: 1609804800000 },
];

const lastCompletedTask = tasks.findLast((task) => task.completed);

console.log(lastCompletedTask.name); // Deploy to staging

Это более эффективно, чем использование find() с перевернутым массивом, поскольку это позволяет избежать создания нового массива.

Использование третьего аргумента callbackFn

Аргумент array полезен, если вы хотите получить доступ к другому элементу в массиве, особенно когда у вас нет существующей переменной, ссылающейся на массив. Следующий пример сначала использует filter() для извлечения положительных значений, а затем использует findLast() для поиска последнего элемента, который меньше своих соседей.

const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const lastTrough = numbers
  .filter((num) => num > 0)
  .findLast((num, idx, arr) => {
    // Without the arr argument, there's no way to easily access the
    // intermediate array without saving it to a variable.
    if (idx > 0 && num >= arr[idx - 1]) return false;
    if (idx < arr.length - 1 && num >= arr[idx + 1]) return false;
    return true;
  });
console.log(lastTrough); // 2

Использование findLast() на разреженных массивах

Пустые слоты в разреженных массивах посещаются и обрабатываются так же, как undefined.

// Declare array with no elements at indexes 2, 3, and 4
const array = [0, 1, , , , 5, 6];

// Shows all indexes, not just those with assigned values
array.findLast((value, index) => {
  console.log(`Visited index ${index} with value ${value}`);
  return false;
});
// Visited index 6 with value 6
// Visited index 5 with value 5
// Visited index 4 with value undefined
// Visited index 3 with value undefined
// Visited index 2 with value undefined
// Visited index 1 with value 1
// Visited index 0 with value 0

// Shows all indexes, including deleted
array.findLast((value, index) => {
  // Delete element 5 on first iteration
  if (index === 6) {
    console.log(`Deleting array[5] with value ${array[5]}`);
    delete array[5];
  }
  // Element 5 is still visited even though deleted
  console.log(`Visited index ${index} with value ${value}`);
  return false;
});
// Deleting array[5] with value 5
// Visited index 6 with value 6
// Visited index 5 with value undefined
// Visited index 4 with value undefined
// Visited index 3 with value undefined
// Visited index 2 with value undefined
// Visited index 1 with value 1
// Visited index 0 with value 0

Вызов findLast() на объектах, не являющихся массивами

Метод findLast() считывает свойство length this, а затем обращается к каждому свойству, ключ которого является неотрицательным целым числом, меньшим length.

const arrayLike = {
  length: 3,
  0: 2,
  1: 7.3,
  2: 4,
  3: 3, // ignored by findLast() since length is 3
};
console.log(
  Array.prototype.findLast.call(arrayLike, (x) => Number.isInteger(x)),
); // 4

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-array.prototype.findlast

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
findLast
97
97
104
83
15.4
97
104
68
15.4
18.0
97
15.4
1.0.0
1.16
18.0.0

См. также

  • Polyfill Array.prototype.findLast в core-js
  • Polyfill Array.prototype.findLast от es-shims
  • Руководство по индексированным коллекциям
  • Array
  • Array.prototype.find()
  • Array.prototype.findIndex()
  • Array.prototype.findLastIndex()
  • Array.prototype.includes()
  • Array.prototype.filter()
  • Array.prototype.every()
  • Array.prototype.some()
  • TypedArray.prototype.findLast()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API