Array.prototype.find()
的 **find()
** 方法 Array
实例返回提供的数组中满足提供的测试函数的第一个元素。如果没有值满足测试函数,则返回 undefined
。
- 如果您需要在数组中找到的元素的 **索引**,请使用
findIndex()
。 - 如果您需要找到 **值的索引**,请使用
indexOf()
。(它类似于findIndex()
,但检查每个元素与值的相等性,而不是使用测试函数。) - 如果您需要找到一个值是否 **存在** 于一个数组中,请使用
includes()
。同样,它检查每个元素与值的相等性,而不是使用测试函数。 - 如果您需要找到是否有任何元素满足提供的测试函数,请使用
some()
。 - 如果您需要找到所有满足提供的测试函数的元素,请使用
filter()
。
试一试
语法
js
find(callbackFn)
find(callbackFn, thisArg)
参数
返回值
数组中第一个满足提供的测试函数的元素。否则,返回 undefined
。
描述
示例
通过其属性之一在数组中查找对象
js
const inventory = [
{ name: "apples", quantity: 2 },
{ name: "bananas", quantity: 0 },
{ name: "cherries", quantity: 5 },
];
function isCherries(fruit) {
return fruit.name === "cherries";
}
console.log(inventory.find(isCherries));
// { name: 'cherries', quantity: 5 }
使用箭头函数和解构
js
const inventory = [
{ name: "apples", quantity: 2 },
{ name: "bananas", quantity: 0 },
{ name: "cherries", quantity: 5 },
];
const result = inventory.find(({ name }) => name === "cherries");
console.log(result); // { name: 'cherries', quantity: 5 }
在数组中查找素数
以下示例在数组中找到一个元素,该元素是素数(如果不存在素数,则返回 undefined
)
js
function isPrime(element, index, array) {
let start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) {
return false;
}
}
return element > 1;
}
console.log([4, 6, 8, 12].find(isPrime)); // undefined, not found
console.log([4, 5, 8, 12].find(isPrime)); // 5
使用 callbackFn 的第三个参数
该 array
参数在您想访问数组中的另一个元素时很有用,尤其是在您没有指向该数组的现有变量时。以下示例首先使用 filter()
提取正值,然后使用 find()
找到第一个小于其相邻元素的元素。
js
const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const firstTrough = numbers
.filter((num) => num > 0)
.find((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(firstTrough); // 1
在稀疏数组上使用 find()
稀疏数组中的空插槽会被访问,并且与 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.find((value, index) => {
console.log("Visited index", index, "with value", value);
});
// Visited index 0 with value 0
// Visited index 1 with value 1
// Visited index 2 with value undefined
// Visited index 3 with value undefined
// Visited index 4 with value undefined
// Visited index 5 with value 5
// Visited index 6 with value 6
// Shows all indexes, including deleted
array.find((value, index) => {
// Delete element 5 on first iteration
if (index === 0) {
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 0 with value 0
// Visited index 1 with value 1
// Visited index 2 with value undefined
// Visited index 3 with value undefined
// Visited index 4 with value undefined
// Visited index 5 with value undefined
// Visited index 6 with value 6
在非数组对象上调用 find()
该 find()
方法读取 this
的 length
属性,然后访问每个键为非负整数且小于 length
的属性。
js
const arrayLike = {
length: 3,
"-1": 0.1, // ignored by find() since -1 < 0
0: 2,
1: 7.3,
2: 4,
};
console.log(Array.prototype.find.call(arrayLike, (x) => !Number.isInteger(x)));
// 7.3
规范
规范 |
---|
ECMAScript 语言规范 # sec-array.prototype.find |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。