Сводка
Метод find()
возвращает значение в массиве, если элемент удовлетворяет условию проверяющей функции. В противном случае возвращается undefined
.
Также смотрите метод findIndex()
, который возвращает индекс найденного в массиве элемента вместо его значения.
Синтаксис
arr.find(callback[, thisArg])
Параметры
callback
- Функция, вызывающаяся для каждого значения в масиве, принимает три аргумента:
element
- Текущий обрабатываемый элемент в массиве.
index
- Индекс текущего обрабатываемого элемента в массиве.
array
- Массив, по которому осуществляется проход.
thisArg
- Необязательный параметр. Значение, используемое в качестве
this
при выполнении функцииcallback
.
Описание
Метод find
вызывает переданную функцию callback
один раз для каждого элемента, присутствующего в массиве, до тех пор, пока она не вернёт true
. Если такой элемент найден, метод find
немедленно вернёт значение этого элемента. В противном случае, метод find
вернёт undefined
. До Firefox 34 функция callback
не вызывалась для «дырок» в массивах (bug 1058394).
Функция callback
вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.
Если в метод find
был передан параметр thisArg
, при вызове callback
он будет использоваться в качестве значения this
. В противном случае в качестве значения this
будет использоваться значение undefined
.
Метод find
не изменяет массив, для которого он был вызван.
Диапазон элементов, обрабатываемых методом find
, устанавливается до первого вызова функции callback
. Элементы, добавленные в массив после начала выполнения метода find
, не будут посещены функцией callback
. Если существующие, непосещённые элементы массива изменяются функцией callback
, их значения, переданные в функцию, будут значениями на тот момент времени когда метод find
посетит их; удалённые элементы посещены не будут.
Примеры
Пример: поиск простого числа в массиве
Следующий пример находит в массиве элемент, являющийся простым числом (либо возвращает undefined
, если в массиве нет простых чисел).
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, не найдено console.log([4, 5, 8, 12].find(isPrime)); // 5
Полифилл
Этот метод был добавлен в спецификации ECMAScript 6 и пока может быть недоступен во всех реализациях JavaScript. Однако, вы можете использовать следующий кусочек кода в качестве полифилла:
if (!Array.prototype.find) { Array.prototype.find = function(predicate) { 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; }; }
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Array.prototype.find' в этой спецификации. |
Стандарт | Изначальное определение. |
ECMAScript 2017 Draft (ECMA-262) Определение 'Array.prototype.find' в этой спецификации. |
Черновик |
Совместимость с браузерами
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari |
---|---|---|---|---|---|---|
Базовая поддержка | 45.0 | 25.0 (25.0) | Нет | 12 | Нет | 7.1 |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | Нет | Нет | 25.0 (25.0) | Нет | Нет | iOS 8 |