Проверить каждый элемент массива на удовлетворение условию
Реализуй функцию every(arr, func) , которая принимает аргументами массив arr и функцию func . Возвращает true , если функция func вернет для каждого элемента массива true . Иначе every возвращает false
Пример проверки что все элементы массива — строки:
every(['mama', 'mila', 'ramu'], function (arrayItem) < return typeof arrayItem === 'string' >)
Проверка что все числа из массива больше 42
every([20, 56, 17], function (arrayItem) < return arrayItem > 42 >)
В функцию func нужно передавать аргументами соответственно элемет массива, индекс элемента массива и сам массив.
every(['mama', 'mila', 'ramu'], function (arrayItem, index, array) < console.log(arrayItem, index, array) return true >)
Array.prototype.every()
Метод every() проверяет, удовлетворяют ли все элементы массива условию, заданному в передаваемой функции.
Примечание: метод возвращает true при любом условии для пустого массива.
Синтаксис
arr.every(callback(currentValue[, index[, array]])[, thisArg])
Параметры
Функция проверки каждого элемента, принимает три аргумента:
Текущий обрабатываемый элемент массива.
Индекс текущего обрабатываемого элемента массива.
Массив, по которому осуществляется проход.
Необязательный параметр. Значение, используемое в качестве this при выполнении функции callback .
Возвращаемое значение
true если функция проверки возвращает truthy значение для каждого элемента массива. Иначе, false .
Описание
Метод every() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве до тех пор, пока не найдёт такой, для которого callback вернёт ложное значение (значение, становящееся равным false при приведении его к типу Boolean ). Если такой элемент найден, метод every() немедленно вернёт false . В противном случае, если callback вернёт true для всех элементов массива, метод every() вернёт true . Функция callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались.
Функция callback вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.
Если в метод every() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this , видимого из функции.
Метод every() не изменяет массив, для которого он был вызван.
Диапазон элементов, обрабатываемых методом every() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода every() , не будут посещены функцией callback . Если существующие элементы массива изменятся, значения, переданные в функцию callback , будут значениями на тот момент времени, когда метод every() посетит их; удалённые элементы посещены не будут.
Метод every() действует подобно квантору всеобщности в математике. В частности, он вернёт true для пустого массива. Это так называемая бессодержательная истина (vacuously true) — все элементы пустого множества (англ.) удовлетворяют любому заданному условию.
Примеры
Пример: проверка размера всех элементов массива
Следующий пример проверяет, являются ли все элементы массива числами, большими 10.
function isBigEnough(element, index, array) return element >= 10; > [12, 5, 8, 130, 44].every(isBigEnough); // false [12, 54, 18, 130, 44].every(isBigEnough); // true
Пример: использование стрелочных функций
Стрелочные функции предоставляют более краткий синтаксис для подобных проверок.
[12, 5, 8, 130, 44].every((elem) => elem >= 10); // false [12, 54, 18, 130, 44].every((elem) => elem >= 10); // true
Полифил
Метод every() был добавлен к стандарту ECMA-262 в 5-м издании; поэтому он может не присутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать every() в реализациях, которые не поддерживают этот метод. Этот алгоритм является точно тем, что описан в ECMA-262 5-го издания; и предполагает что Object и TypeError имеют свои первоначальные значения и что callback.call вычисляется в оригинальное значение Function.prototype.call() .
if (!Array.prototype.every) Array.prototype.every = function (callbackfn, thisArg) "use strict"; var T, k; if (this == null) throw new TypeError("this is null or not defined"); > // 1. Положим O равным результату вызова ToObject над значением // this, переданным в качестве аргумента. var O = Object(this); // 2. Положим lenValue равным результату вызова внутреннего метода Get // объекта O с аргументом "length". // 3. Положим len равным ToUint32(lenValue). var len = O.length >>> 0; // 4. Если IsCallable(callbackfn) равен false, выкинем исключение TypeError. if (typeof callbackfn !== "function") throw new TypeError(); > // 5. Если thisArg присутствует, положим T равным thisArg; иначе положим T равным undefined. if (arguments.length > 1) T = thisArg; > // 6. Положим k равным 0. k = 0; // 7. Пока k < len, будем повторятьwhile (k len) var kValue; // a. Положим Pk равным ToString(k). // Это неявное преобразование для левостороннего операнда в операторе in // b. Положим kPresent равным результату вызова внутреннего метода // HasProperty объекта O с аргументом Pk. // Этот шаг может быть объединён с шагом c // c. Если kPresent равен true, то if (k in O) // i. Положим kValue равным результату вызова внутреннего метода Get // объекта O с аргументом Pk. kValue = O[k]; // ii. Положим testResult равным результату вызова внутреннего метода Call // функции callbackfn со значением T в качестве this и списком аргументов, // содержащим kValue, k и O. var testResult = callbackfn.call(T, kValue, k, O); // iii. Если ToBoolean(testResult) равен false, вернём false. if (!testResult) return false; > > k++; > return true; >; >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.prototype.every |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.forEach()
- Array.prototype.some()
- Array.prototype.find()
- TypedArray.prototype.every() (en-US)
Метод every
Метод every проверяет элементы массива в соответствии с переданной функцией. Метод возвращает true , если для всех элементов массива переданная функция вернет true , в противном случае метод возвращает false .
В функцию можно передавать три параметра. Если эти параметры есть (они не обязательны), то в первый автоматически попадет элемент массива, во второй попадет его номер в массиве (индекс), а в третий — сам массив.
Синтаксис
массив.every(function(элемент, индекс, массив) < return true или false; >);
Пример
Проверим, что все элементы в массиве чисел положительные:
let arr = [1, 2, 3, 4, 5]; let check = arr.every(function(elem) < if (elem >= 0) < return true; >else < return false; >>); console.log(check);
Результат выполнения кода:
Пример
Проверим, что произведение элемента на его порядковый номер всегда меньше 30 :
let arr = [1, 2, 3, 4, 5]; let check = arr.every(function(elem, index) < if (elem * index < 30) < return true; >else < return false; >>); console.log(check);
Результат выполнения кода:
Пример
При необходимости в третий параметр можно передать сам массив:
let check = arr.every(function(elem, index, arr) < тут будет доступен массив arr >);
Смотрите также
- метод some ,
который также позволяет выполнить проверку массива - методы map и forEach ,
которые позволяют применить функцию к каждому элементу массива - методы reduce и reduceRight ,
сворачивающие массив к одному значению
Массив: перебирающие методы
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/array-methods.
Современный стандарт JavaScript предоставляет много методов для «умного» перебора массивов, которые есть в современных браузерах…
…Ну а для их поддержки в IE8- просто подключите библиотеку ES5-shim.
forEach
Метод «arr.forEach(callback[, thisArg])» используется для перебора массива.
Он для каждого элемента массива вызывает функцию callback .
Этой функции он передаёт три параметра callback(item, i, arr) :
- item – очередной элемент массива.
- i – его номер.
- arr – массив, который перебирается.
var arr = ["Яблоко", "Апельсин", "Груша"]; arr.forEach(function(item, i, arr) < alert( i + ": " + item + " (массив:" + arr + ")" ); >);
Второй, необязательный аргумент forEach позволяет указать контекст this для callback . Мы обсудим его в деталях чуть позже, сейчас он нам не важен.
Метод forEach ничего не возвращает, его используют только для перебора, как более «элегантный» вариант, чем обычный цикл for .
filter
Метод «arr.filter(callback[, thisArg])» используется для фильтрации массива через функцию.
Он создаёт новый массив, в который войдут только те элементы arr , для которых вызов callback(item, i, arr) возвратит true .
var arr = [1, -1, 2, -2, 3]; var positiveArr = arr.filter(function(number) < return number >0; >); alert( positiveArr ); // 1,2,3
map
Метод «arr.map(callback[, thisArg])» используется для трансформации массива.
Он создаёт новый массив, который будет состоять из результатов вызова callback(item, i, arr) для каждого элемента arr .
var names = ['HTML', 'CSS', 'JavaScript']; var nameLengths = names.map(function(name) < return name.length; >); // получили массив с длинами alert( nameLengths ); // 4,3,10
every/some
Эти методы используются для проверки массива.
- Метод «arr.every(callback[, thisArg])» возвращает true , если вызов callback вернёт true для каждого элемента arr .
- Метод «arr.some(callback[, thisArg])» возвращает true , если вызов callback вернёт true для какого-нибудь элемента arr .
var arr = [1, -1, 2, -2, 3]; function isPositive(number) < return number >0; > alert( arr.every(isPositive) ); // false, не все положительные alert( arr.some(isPositive) ); // true, есть хоть одно положительное
reduce/reduceRight
Метод «arr.reduce(callback[, initialValue])» используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.
Это один из самых сложных методов для работы с массивами. Но его стоит освоить, потому что временами с его помощью можно в несколько строк решить задачу, которая иначе потребовала бы в разы больше места и времени.
Метод reduce используется для вычисления на основе массива какого-либо единого значения, иначе говорят «для свёртки массива». Чуть далее мы разберём пример для вычисления суммы.
Он применяет функцию callback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.
Аргументы функции callback(previousValue, currentItem, index, arr) :
- previousValue – последний результат вызова функции, он же «промежуточный результат».
- currentItem – текущий элемент массива, элементы перебираются по очереди слева-направо.
- index – номер текущего элемента.
- arr – обрабатываемый массив.
Кроме callback , методу можно передать «начальное значение» – аргумент initialValue . Если он есть, то на первом вызове значение previousValue будет равно initialValue , а если у reduce нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
Проще всего понять работу метода reduce на примере.
Например, в качестве «свёртки» мы хотим получить сумму всех элементов массива.
Вот решение в одну строку:
var arr = [1, 2, 3, 4, 5] // для каждого элемента массива запустить функцию, // промежуточный результат передавать первым аргументом далее var result = arr.reduce(function(sum, current) < return sum + current; >, 0); alert( result ); // 15
Разберём, что в нём происходит.
При первом запуске sum – исходное значение, с которого начинаются вычисления, равно нулю (второй аргумент reduce ).
Сначала анонимная функция вызывается с этим начальным значением и первым элементом массива, результат запоминается и передаётся в следующий вызов, уже со вторым аргументом массива, затем новое значение участвует в вычислениях с третьим аргументом и так далее.
Поток вычислений получается такой

В виде таблицы где каждая строка – вызов функции на очередном элементе массива:
| sum | current | результат | |
|---|---|---|---|
| первый вызов | 0 | 1 | 1 |
| второй вызов | 1 | 2 | 3 |
| третий вызов | 3 | 3 | 6 |
| четвёртый вызов | 6 | 4 | 10 |
| пятый вызов | 10 | 5 | 15 |
Как видно, результат предыдущего вызова передаётся в первый аргумент следующего.
Кстати, полный набор аргументов функции для reduce включает в себя function(sum, current, i, array) , то есть номер текущего вызова i и весь массив arr , но здесь в них нет нужды.
Посмотрим, что будет, если не указать initialValue в вызове arr.reduce :
var arr = [1, 2, 3, 4, 5] // убрали 0 в конце var result = arr.reduce(function(sum, current) < return sum + current >); alert( result ); // 15
Результат – точно такой же! Это потому, что при отсутствии initialValue в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
Таблица вычислений будет такая же, за вычетом первой строки.
Метод arr.reduceRight работает аналогично, но идёт по массиву справа-налево.
Итого
Мы рассмотрели методы:
- forEach – для перебора массива.
- filter – для фильтрации массива.
- every/some – для проверки массива.
- map – для трансформации массива в массив.
- reduce/reduceRight – для прохода по массиву с вычислением значения.
Во многих ситуациях их использование позволяет написать код короче и понятнее, чем обычный перебор через for .