find()
method returns the
value
of the
first element
in the provided array that satisfies the provided testing function.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
findIndex()
.
Array.prototype.indexOf()
. (It’s similar to
findIndex()
, but checks each element for equality with the value instead of using a testing function.)
Array.prototype.includes()
. Again, it checks each element for equality with the value instead of using a testing function.
Array.prototype.some()
.
arr.find(callback(element[, index[, array]])[, thisArg])
callback
element
The current element in the array.
index
可选
The index (position) of the current element in the array.
array
可选
find
was called on.
thisArg
可选
this
inside
callback
.
value
of the
first element
in the array that satisfies the provided testing function. Otherwise,
undefined
被返回。
find
method executes the
callback
function once for each index of the array until the
callback
返回
truthy
value. If so,
find
immediately returns the value of that element. Otherwise,
find
返回
undefined
.
callback
is invoked for
every
index of the array, not just those with assigned values. This means it may be less efficient for sparse arrays, compared to methods that only visit assigned values.
若
thisArg
parameter is provided to
find
, it will be used as the
this
value inside each invocation of the
callback
. If it is not provided, then
undefined
被使用。
find
method does not mutate the array on which it is called, but the function provided to
callback
can. If so, the elements processed by
find
are set
before
the first invocation of
callback
. Therefore:
callback
will not visit any elements added to the array after the call to
find
begins.
callback
, its value passed to the
callback
will be the value at the time
find
visits that element's index.
deleted
are still visited.
This method has been added to the ECMAScript 2015 specification and may not be available in all JavaScript implementations yet. However, you can polyfill
Array.prototype.find
with the following snippet:
// https://tc39.github.io/ecma262/#sec-array.prototype.find
if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, 'find', {
value: function(predicate) {
// 1. Let O be ? ToObject(this value).
if (this == null) {
throw TypeError('"this" is null or not defined');
}
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') {
throw TypeError('predicate must be a function');
}
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1];
// 5. Let k be 0.
var k = 0;
// 6. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return kValue.
var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) {
return kValue;
}
// e. Increase k by 1.
k++;
}
// 7. Return undefined.
return undefined;
},
configurable: true,
writable: true
});
}
If you need to support truly obsolete JavaScript engines that don't support
Object.defineProperty
, it is best not to polyfill
Array.prototype
at all, as you cannot make it non-enumerable.
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 }
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 }
The following example finds an element in the array that is a prime number (or returns
undefined
if there is no prime number):
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
The following examples show that nonexistent and deleted elements are visited, and that the value passed to the callback is their value when visited:
// 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(function(value, index) {
console.log('Visited index ', index, ' with value ', value);
});
// Shows all indexes, including deleted
array.find(function(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);
});
// expected output:
// 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
| 规范 |
|---|
|
ECMAScript (ECMA-262)
The definition of 'Array.prototype.find' in that specification. |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
find
|
Chrome 45 | Edge 12 | Firefox 25 | IE No | Opera 32 | Safari 8 | WebView Android 45 | Chrome Android 45 | Firefox Android 4 | Opera Android 32 | Safari iOS 8 | Samsung Internet Android 5.0 |
nodejs
4.0.0
|
完整支持
不支持
用户必须明确启用此特征。
Array.prototype.findIndex()
– find and return an index
Array.prototype.includes()
– test whether a value exists in the array
Array.prototype.filter()
– remove all non-matching elements
Array.prototype.every()
– test all elements
Array.prototype.some()
– test until one element matches
Array
Array.from()
Array.isArray()
Array.of()
Array.prototype.concat()
Array.prototype.copyWithin()
Array.prototype.entries()
Array.prototype.every()
Array.prototype.fill()
Array.prototype.filter()
Array.prototype.find()
Array.prototype.findIndex()
Array.prototype.flat()
Array.prototype.flatMap()
Array.prototype.forEach()
Array.prototype.includes()
Array.prototype.indexOf()
Array.prototype.join()
Array.prototype.keys()
Array.prototype.lastIndexOf()
Array.prototype.map()
Array.prototype.pop()
Array.prototype.push()
Array.prototype.reduce()
Array.prototype.reduceRight()
Array.prototype.reverse()
Array.prototype.shift()
Array.prototype.slice()
Array.prototype.some()
Array.prototype.sort()
Array.prototype.splice()
Array.prototype.toLocaleString()
Array.prototype.toSource()
Array.prototype.toString()
Array.prototype.unshift()
Array.prototype.values()
Array.prototype[@@iterator]()
get Array[@@species]
Function
Object
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.setPrototypeOf()