Array.prototype.findLast()

基线 2022

新功能

2022 年 8 月起,此功能在最新设备和浏览器版本中均可使用。此功能可能不适用于较旧的设备或浏览器。

findLast()方法Array实例以反向顺序迭代数组,并返回满足提供的测试函数的第一个元素的值。如果没有任何元素满足测试函数,则返回undefined

如果你需要找到

  • 第一个匹配的元素,使用find()
  • 数组中最后一个匹配元素的索引,使用findLastIndex()
  • 值的索引,使用indexOf()。(它类似于findIndex(),但会检查每个元素是否与值相等,而不是使用测试函数。)
  • 是否存在值在数组中,使用includes()。同样,它检查每个元素是否与值相等,而不是使用测试函数。
  • 如果任何元素满足提供的测试函数,使用some()

试试看

语法

js
findLast(callbackFn)
findLast(callbackFn, thisArg)

参数

callbackFn

要对数组中每个元素执行的函数。它应该返回一个真值,以指示找到匹配元素,否则返回一个假值。该函数使用以下参数调用

元素

数组中正在处理的当前元素。

索引

数组中正在处理的当前元素的索引。

数组

findLast()被调用的数组。

thisArg 可选

在执行callbackFn时用作this的值。参见迭代方法

返回值

数组中满足提供的测试函数的最后一个(索引最高的)元素;如果找不到匹配元素,则为undefined

描述

findLast()方法是一个迭代方法。它对数组中的每个元素按降序索引调用提供的callbackFn函数,直到callbackFn返回一个真值。然后,findLast()返回该元素并停止迭代数组。如果callbackFn从未返回真值,findLast()将返回undefined。阅读迭代方法部分,以了解有关这些方法如何工作的更多信息。

callbackFn被调用以获得数组的每个索引,而不仅仅是那些具有分配值的索引。稀疏数组中的空槽的行为与undefined相同。

findLast()方法是泛型。它只期望this值具有length属性和整数键属性。

示例

在数组中查找匹配元素属性的最后一个对象

此示例展示了如何根据数组元素的属性创建测试。

js
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 }

使用箭头函数和解构

前面的示例可以使用箭头函数和对象解构编写

js
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

js
function isPrime(element) {
  if (element % 2 === 0 || element < 2) {
    return false;
  }
  for (let factor = 3; factor <= Math.sqrt(element); factor += 2) {
    if (element % 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

使用 callbackFn 的第三个参数

array参数在您想要访问数组中的另一个元素时很有用,尤其是在您没有指向该数组的现有变量时。以下示例首先使用filter()提取正值,然后使用findLast()查找小于其相邻元素的最后一个元素。

js
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相同。

js
// 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}`);
});
// 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}`);
});
// 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()方法读取thislength属性,然后访问每个键为非负整数且小于length的属性。

js
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 语言规范
# sec-array.prototype.findlast

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅