Array.prototype.find()

Сводка

Метод 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

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: AlexeyMM, burashka, torbasow, Mingun
 Обновлялась последний раз: AlexeyMM,