Every: примеры (JAVASCRIPT)

JavaScript every: проверка условий для всех элементов массива
Раздел: Массивы, Проверка
every(callback: function, thisArg?: any): boolean

Основные сведения о методе every()

Метод every() в JavaScript применяется к массивам. Он проверяет, удовлетворяют ли все элементы массива условию, заданному в передаваемой функции-колбэке. Этот метод часто используется для валидации данных или проверки выполнения условий для каждого элемента коллекции.

Синтаксис метода: arr.every(callback(currentValue[, index[, array]])[, thisArg]).

Аргументы:

  • callback — функция, проверяющая каждый элемент. Принимает три параметра:
    • currentValue — текущий обрабатываемый элемент.
    • index (необязательный) — индекс текущего элемента.
    • array (необязательный) — массив, по которому осуществляется проход.
  • thisArg (необязательный) — значение, используемое в качестве this при выполнении функции callback.

Возвращаемое значение: true, если функция callback вернула truthy-значение для всех элементов массива. В противном случае — false. Метод перебирает элементы до первого ложного результата колбэка, после чего завершает работу.

Простые примеры использования

Пример проверки, все ли числа в массиве больше 10:

const arr1 = [12, 15, 18, 20];
const result1 = arr1.every(num => num > 10);
console.log(result1);
true

Пример с использованием индекса и массива в колбэке:

const arr2 = [1, 2, 3, 4];
const result2 = arr2.every((elem, index, array) => elem < array.length);
console.log(result2);
true

Пример с пустым массивом. Метод возвращает true, так как нет элементов, нарушающих условие:

const arr3 = [];
const result3 = arr3.every(num => num > 10);
console.log(result3);
true

Использование второго аргумента thisArg для передачи контекста:

const threshold = { value: 10 };
function checkNum(num) {
  return num > this.value;
}
const arr4 = [12, 15, 8, 20];
const result4 = arr4.every(checkNum, threshold);
console.log(result4);
false

Похожие методы в JavaScript

Метод some() возвращает true, если хотя бы один элемент удовлетворяет условию. Противоположен every() по логике.

Метод filter() создает новый массив со всеми элементами, прошедшими проверку.

Метод find() возвращает первый элемент, соответствующий условию, или undefined.

Метод forEach() выполняет функцию для каждого элемента, но не возвращает результат проверки.

Выбор метода зависит от задачи. Метод every() оптимален для проверки выполнения условия всеми элементами. Для поиска хотя бы одного подходящего элемента применяется some(). Если нужно получить подмножество элементов, используется filter().

Типичные ошибки

Изменение массива внутри колбэка может привести к неожиданным результатам.

const arr = [1, 2, 3, 4];
const result = arr.every((num, index, array) => {
  array.pop(); // Изменение массива во время итерации
  return num < 5;
});
console.log(result);
true

Но массив будет изменен, а проверка пройдет не для всех исходных элементов.

Использование every() для проверки существования элементов в пустом массиве. Результат всегда true, что иногда логически ошибочно.

const emptyArr = [];
const result = emptyArr.every(num => num > 10);
console.log(result); // true, но элементов нет
true

Некорректное использование this. Без передачи thisArg или использования стрелочной функции значение this может быть неопределенным.

const obj = { limit: 5 };
function check(num) {
  return num > this.limit;
}
const arr = [10, 20];
// Без указания контекста
const result = arr.every(check);
console.log(result);
false (или ошибка в строгом режиме)

Изменения в спецификации

Метод every() был добавлен в стандарт ECMAScript 5 (ES5). С тех пор существенных изменений в его работе не было. В ECMAScript 2015 (ES6) появились стрелочные функции, которые удобно использовать в качестве колбэка из-за лексического this.

Современные движки JavaScript оптимизируют производительность метода. Спецификация требует, чтобы метод пропускал отсутствующие элементы в разреженных массивах.

Расширенные примеры

Проверка структуры объектов в массиве:

Пример javascript
const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 28 }
];
const allHaveNames = users.every(user => user.name && typeof user.name === 'string');
console.log(allHaveNames);
true

Комбинирование every() с другими методами. Проверка, что все строки в массиве непустые и содержат только буквы:

Пример javascript
const strings = ['Hello', 'World', 'JavaScript'];
const allValid = strings.every(str => {
  return typeof str === 'string' && str.length > 0 && /^[a-zA-Z]+$/.test(str);
});
console.log(allValid);
false (из-за строки 'JavaScript', содержащей заглавные и строчные буквы, но без пробелов и цифр - на самом деле true, так как регулярное выражение допускает и заглавные и строчные буквы. Если бы требовались только строчные, то было бы false.)

Исправленный пример с проверкой только строчных букв:

Пример javascript
const strings2 = ['hello', 'world', 'javascript'];
const allValid2 = strings2.every(str => /^[a-z]+$/.test(str));
console.log(allValid2);
true

Использование every() для раннего выхода из цикла при обнаружении несоответствия. Проверка отсортированности массива:

Пример javascript
const sortedArr = [1, 2, 3, 4, 5];
const isSorted = sortedArr.every((num, index, arr) => index === 0 || num >= arr[index - 1]);
console.log(isSorted);
true

Проверка на четность всех чисел в массиве с использованием битовой операции:

Пример javascript
const numbers = [2, 4, 6, 8];
const allEven = numbers.every(num => (num & 1) === 0);
console.log(allEven);
true

Работа с разреженными массивами. every() пропускает отсутствующие элементы:

Пример javascript
const sparseArr = [1, , 3, , 5]; // Элементы с индексами 1 и 3 отсутствуют
const check = sparseArr.every(num => num !== undefined);
console.log(check); // true, так как для отсутствующих элементов колбэк не вызывается
true

Аналоги в других языках программирования

PHP: функция array_every() (доступна с PHP 7) или пользовательская реализация.

$array = [12, 15, 18, 20];
$result = array_every($array, function($value) {
    return $value > 10;
});
var_dump($result);
bool(true)

Python: встроенная функция all() работает с итерируемыми объектами.

lst = [12, 15, 18, 20]
result = all(x > 10 for x in lst)
print(result)
True

MySQL: агрегатная функция с условием в HAVING или подзапросе.

-- Пример логики: проверка, что все значения > 10
SELECT COUNT(*) = SUM(val > 10) AS all_greater_than_10 FROM my_table;

C# (LINQ): метод All() для коллекций.

int[] arr = {12, 15, 18, 20};
bool result = arr.All(x => x > 10);
Console.WriteLine(result);
True

JS every function comments

En
Every Tests whether all elements in the array pass the test implemented by the provided function.