The find()
method returns a value in the array, if an element in the array satisfies the provided testing function. Otherwise {{jsxref("undefined")}} is returned.
See also the {{jsxref("Array.findIndex", "findIndex()")}} method, which returns the index of a found element in the array instead of its value.
Syntax
arr.find(callback[, thisArg])
Parameters
callback
- Function to execute on each value in the array, taking three arguments:
element
- The current element being processed in the array.
index
- The index of the current element being processed in the array.
array
- The array
find
was called upon.
thisArg
- Optional. Object to use as
this
when executingcallback
.
Return value
A value in the array if an element passes the test; otherwise, {{jsxref("undefined")}}.
Description
The find
method executes the callback
function once for each element present in the array until it finds one where callback
returns a true value. If such an element is found, find
immediately returns the value of that element. Otherwise, find
returns {{jsxref("undefined")}}. callback
is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
callback
is invoked with three arguments: the value of the element, the index of the element, and the Array object being traversed.
If a thisArg
parameter is provided to find
, it will be used as the this
for each invocation of the callback
. If it is not provided, then {{jsxref("undefined")}} is used.
find
does not mutate the array on which it is called.
The range of elements processed by find
is set before the first invocation of callback
. Elements that are appended to the array after the call to find
begins will not be visited by callback
. If an existing, unvisited element of the array is changed by callback
, its value passed to the visiting callback
will be the value at the time that find
visits that element's index; elements that are deleted are not visited.
Examples
Find an object in an array by one of its properties
var inventory = [ {name: 'apples', quantity: 2}, {name: 'bananas', quantity: 0}, {name: 'cherries', quantity: 5} ]; function findCherries(fruit) { return fruit.name === 'cherries'; } console.log(inventory.find(findCherries)); // { name: 'cherries', quantity: 5 }
Find a prime number in an array
The following example finds an element in the array that is a prime number (or returns {{jsxref("undefined")}} if there is no prime number).
function isPrime(element, index, array) { var 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
Polyfill
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:
if (!Array.prototype.find) { Object.defineProperty(Array.prototype, "find", { value: function(predicate) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; } }); }
If you need to support truly obsolete JavaScript engines that don't support Object.defineProperty
, it's best not to polyfill Array.prototype
methods at all, as you can't make them non-enumerable.
Specifications
Specification | Status | Comment |
---|---|---|
{{SpecName('ES6', '#sec-array.prototype.find', 'Array.prototype.find')}} | {{Spec2('ES6')}} | Initial definition. |
{{SpecName('ESDraft', '#sec-array.prototype.find', 'Array.prototype.find')}} | {{Spec2('ESDraft')}} |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | {{CompatChrome(45.0)}} | {{CompatGeckoDesktop("25.0")}} | {{CompatNo}} | 12 | {{CompatOpera(32.0)}} | {{CompatSafari("7.1")}} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Edge | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | {{CompatNo}} | {{CompatNo}} | {{CompatGeckoMobile("25.0")}} | {{CompatNo}} | 12 | {{CompatNo}} | 8.0 |
See also
- {{jsxref("Array.prototype.findIndex()")}}
- {{jsxref("Array.prototype.every()")}}