MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/a3e7b5301fea

Array.prototype.find()

Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

Метод find() повертає значення першого елементу в масиві, що задовільняє передану функцію тестування. В іншому випадку буде повернено undefined.

function isBigEnough(element) {
  return element >= 15;
}

[12, 5, 8, 130, 44].find(isBigEnough); // 130

Зверніть увагу також на метод findIndex(), який повертає індекс знайденого елементу масиву, замість його значення.

Якщо вам необхідно знайти позицію елемента або дізнатись чи існує в масиві, використовуйте Array.prototype.indexOf() або Array.prototype.includes().

Синтаксис

arr.find(callback[, thisArg])

Параметри

callback
Функція, що виконується для кожного значення в масиві і приймає три аргументи:
element
Поточний елемент масиву.
index
Індекс поточного елементу масиву.
array
Масив для якого було викликано find.
thisArg
Не обов'язково. Об'єкт який використовувати як this коли виконується callback.

Return value

Значення в масиві якщо елемент проходить тест; в іншому випадку, undefined.

Опис

Метод find виконує callback функцію один раз для кожного елементу в мвсиві, аж поки не знаходиться елемент де callback повертає значення true. Якщо такий елемент знайдено, find одразу ж повертає значення цього елементу. В іншому випадку, find повертає undefined. callback викликається лише для тих індексів масиву, які мають присвоєне значення; він ніколи не викликається для тих індексів які було видалено або які ніколи не мали присвоєного значення.

callback викликається з трьома параметрами: значення елемента, індекс елемента, і об'єкт Array який перебирається.

Якщо параметр thisArg передано в find, його буде використано як this для кожного виклику callback. Якщо його не передано, тоді undefined використовуватиметься.

find не змінює масив для на якому він викликаний.

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.

Приклади

Знайти об'єкт в масиві за однією з його властивостей

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 }

Знайти просте число в масиві

Наступний приклад знаходить елемент в масиві, який є простим числом (або повертає 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, 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:

// 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 new 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 new 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;
    }
  });
}

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
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Array.prototype.find' in that specification.
Standard Initial definition.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Array.prototype.find' in that specification.
Draft  

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Edge Opera Safari
Basic support 45.0 25.0 (25.0) No support 12 32.0 7.1
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Edge Opera Mobile Safari Mobile
Basic support No support No support 25.0 (25.0) No support 12 No support 8.0

See also

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

 Зробили внесок у цю сторінку: Careless_angel, RuslanaGRA, braggae
 Востаннє оновлена: Careless_angel,