Проверить каждый элемент массива на удовлетворение условию
Реализуй функцию 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 ,
сворачивающие массив к одному значению
.every ( )
Проверить по списку, что все сделали домашнее задание? Проще простого с массивами и методом every .
Время чтения: меньше 5 мин
Открыть/закрыть навигацию по статье
Контрибьюторы:
Обновлено 29 мая 2022
Кратко
Скопировать ссылку «Кратко» Скопировано
Метод массива .every ( ) позволяет узнать, удовлетворяют ли все элементы в массиве условию в функции-колбэке. Результатом вызова метода .every ( ) будет boolean-значение true или false . Если хотя бы один элемент не будет удовлетворять условию, то результат будет false .
Пример
Скопировать ссылку «Пример» Скопировано
Данные представляют собой информации о пользователях с именем и флагом, онлайн ли сейчас пользователь:
const users = [ < name: 'Анна', online: true >, < name: 'Михаил', online: true >, < name: 'Саша', online: true >,]const users = [ name: 'Анна', online: true >, name: 'Михаил', online: true >, name: 'Саша', online: true >, ]
Проверка, что все пользователи сейчас онлайн, вернёт true :
const isAllUsersOnline = users.every(user => return user.online>)console.log(isAllUsersOnline)// trueconst isAllUsersOnline = users.every(user => return user.online >) console.log(isAllUsersOnline) // true
Проверка, что всех пользователей зовут «Анна», вернёт false :
const isAllUsersAnna = users.every(user => return user.name === 'Анна'>)console.log(isAllUsersAnna);// falseconst isAllUsersAnna = users.every(user => return user.name === 'Анна' >) console.log(isAllUsersAnna); // false
Как пишется
Скопировать ссылку «Как пишется» Скопировано
В метод .every ( ) необходимо передать колбэк-функцию, которая должна возвращать boolean-значение, аналогично методам Array.filter или Array.some. Возвращать можно и другие truthy и falsy значения, они преобразуются согласно типу.
Функция, которую мы передаём в метод .every ( ) , может принимать три параметра:
- item — элемент массива в текущей итерации;
- index — индекс текущего элемента;
- arr — сам массив, который мы перебираем.
const balls = ['', '', '', ''] const areAllBallsAreGreen = balls.every((ball, index, arr) => ball === '')// trueconst balls = ['', '', '', ''] const areAllBallsAreGreen = balls.every((ball, index, arr) => ball === '') // true
Как понять
Скопировать ссылку «Как понять» Скопировано
Метод .every ( ) позволяет решить задачу, когда необходимо узнать, что все элементы в массиве соответствуют условию. Метод, по сути, противоположен .some(). В .every ( ) , чтобы результат выражения стал true , необходимо, чтобы все элементы удовлетворяли условию функции-предиката.
Для сравнения напишем пример через for или while :
const nums = [10, 303, 16, 20, 21] let areGreater = true;for (let i = 0; i < nums.length; i++) if (nums[i] < 10) areGreater = false break >>const nums = [10, 303, 16, 20, 21] let areGreater = true; for (let i = 0; i nums.length; i++) if (nums[i] 10) areGreater = false break > >
Метод .every ( ) позволит написать все в одно компактное и понятное выражение.
const nums = [10, 303, 16, 20, 21] const areGreater = nums.every(num => num >= 10)console.log(areGreater);// trueconst nums = [10, 303, 16, 20, 21] const areGreater = nums.every(num => num >= 10) console.log(areGreater); // true
В примерах код был написан с помощью двух разных подходов: императивного и декларативного. Использование метода .every ( ) делает код декларативнее.
На практике
Скопировать ссылку «На практике» Скопировано
Егор Огарков советует
Скопировать ссылку «Егор Огарков советует» Скопировано
Из-за того, что результат выполнения метода Array . every – это boolean-значение, метод можно удобно использовать прямо в условных конструкциях:
const drinks = ['', '', '', '', ''] if (drinks.every(drink => drink === '')) console.log('This is a beer party! ')>const drinks = ['', '', '', '', ''] if (drinks.every(drink => drink === '')) console.log('This is a beer party! ') >
Но следует помнить, что проверка пустого массива всегда вернёт true
const drinks = [] if (drinks.every(drink => drink === '') console.log('This is a beer party! without BEER :)')>const drinks = [] if (drinks.every(drink => drink === '') console.log('This is a beer party! without BEER :)') >