Array.every() в JavaScript — чи всі елементи відповідають умові


Опис

Метод every() дозволяє проводити перевірку всіх елементів масиву на відповідність певному критерію. Якщо кожен елемент масиву задовольняє заданій умові, метод повертає true; в іншому випадку — false. Це може нагадувати процес перевірки відповідей на питання в тесті: якщо всі відповіді правильні, ви отримаєте позитивний результат, а якщо хоча б одна відповідь невірна — результат буде негативний. Для використання every() вам потрібно передати функцію (параметр callbackFn), яка описує критерій перевірки для елементів масиву.

Приклад використання:

const numbers = [2, 4, 6, 8, 10];

// Перевіримо, чи є всі елементи парними числами
const allAreEven = numbers.every(function(number) {
    return number % 2 === 0;
});

console.log(allAreEven);  // Виведе: true, адже всі числа парні

Важливо: every() залишає первісний масив без змін. Однак, ваша функція callbackFn може його змінювати. Якщо ви збираєтесь робити це, маєте знати декілька нюансів:

  • callbackFn не "відвідає" елементи, додані після початку роботи every(), якщо ці додані елементи збільшують довжину масиву.
  • Якщо під час роботи every() ви змінюєте елементи, які вже були оброблені, ця функція зворотного виклику не буде застосована до них повторно.
  • Якщо під час ітерації callbackFn змінює елемент, який ще не був "відвіданий", то every() працює з актуальним значенням на момент його "відвідування". Елементи, які були видалені до їхнього "відвідування", ігноруються.
автор: Bond

Загальний опис

автор: NagarD

Порада

Метод every() очікує, що значення this включатиме властивість length і властивості з цілими числовими ключами.

автор: Bond
Порада

Корисною особливістю методу every() є можливість передати йому callback-функцію, яка приймає три аргументи: поточний елемент, індекс та сам масив. Це дозволяє вам визначати умову перевірки з використанням цих параметрів і створювати гнучкі перевірки.

автор: Bond
Порада

Зверніть увагу, що якщо масив порожній, метод every() завжди поверне true, оскільки не буде жодного елемента, який не відповідає умові. У такому випадку це може бути корисною перевіркою.

автор: Bond
Нотатка

Цікаво, що every() завжди повертає true для пустого масиву, адже відсутні елементи автоматично вважаються задовольняючими будь-якій умові.

автор: Bond
Нотатка

Функція callbackFn працює не з усіма індексами масиву, а лише з тими, що мають визначене значення. Таким чином, порожні слоти в розріджених масивах ігноруються.

автор: Bond

Синтаксис

every(callbackFn)
every(callbackFn, thisArg)

Параметри

callbackFn

Функція, яку потрібно застосовувати до кожного елемента масиву. Має повертати true для того, щоб підтвердити, що даний елемент відповідає критеріям, або false у протилежному випадку.

Функція callbackFn викликається з наступними аргументами:

  • element: поточний елемент, який обробляється у масиві;

  • index: індекс поточного елемента, який обробляється у масиві;

  • array: масив, на якому було викликано метод find().

автор: Bond

thisArg

Значення, яке використовується як this при виконанні callbackFn.

автор: Bond

Повернення

true

Якщо callbackFn повертає true для кожного елемента масиву.

автор: Bond

false

Якщо callbackFn поверне false для будь-якого з елементів масиву.

автор: Bond

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 1.5 3 9.5 12 9
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 1
Підтримка: серверні переглядачі
Переглядач Node.js Deno
0.10.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

У даному прикладі ми викликаємо метод every() на об'єкті arrayLike, який не є масивом, використовуючи властивість length та callback-функцію для перевірки типу кожного елемента. В результаті отримуємо true, оскільки всі елементи з властивостей 0, 1, 2 є рядками.

const arrayLike = {
  length: 3,
  0: "a",
  1: "b",
  2: "c",
  3: 345, // ігнорується методом every(), оскільки length дорівнює 3
};
console.log(
  Array.prototype.every.call(arrayLike, (x) => typeof x === "string"),
); // true
автор: Bond

Цей приклад перевіряє, чи всі елементи в масиві array1 менші за 40, використовуючи метод every(). Результат перевірки виводиться на сторінку у вигляді рядків true або false.

HTML

<header>
  <h2 class="title">Перевірка кожного елемента в масиві</h2>
  <p class="description">Цей приклад перевіряє, чи всі елементи в масиві задовольняють певну умову.</p>
</header>
<main>
  <p>Масив для перевірки: <code>[1, 30, 39, 29, 10, 13]</code></p>
  <p>Умова: <code>кожен елемент масиву менший від числа 40</code></p>
  <div class="result">
    <p>Результат: <span id="output"></span></p>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

code {
  color: #ff0000;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.main {
  margin-top: 20px;
}

.result {
  margin-top: 10px;
}

.result p {
  font-weight: bold;
}

.result span {
  color: green;
}

JS

const isBelowThreshold = currentValue => currentValue < 40;

const array1 = [1, 30, 39, 29, 10, 13];

const outputElement = document.getElementById("output");
outputElement.textContent = array1.every(isBelowThreshold);
//# sourceURL=pen.js
автор: Bond

Порожній масив, який «проходить» усе; обрив на першій невдачі; тіло без return і async-колбек.

console.log('усі парні:', [2, 4, 6].every(n => n % 2 === 0));   // true
console.log('не всі:', [2, 3, 6].every(n => n % 2 === 0));      // false

// порожній масив проходить будь-яку перевірку
console.log('[].every:', [].every(n => n > 1000));  // true
console.log('[].some:', [].some(n => n > 1000));    // false — навпаки

// перебір обривається на першій невдачі
let calls = 0;
[1, 2, 3, 4].every(n => { calls++; return n < 2; });
console.log('викликів функції:', calls);  // 2, а не 4

// тіло у фігурних дужках без return
console.log('без return:', [1, 2, 3].every(n => { n > 0; }));  // false

// async-колбек завжди істинний
console.log('async:', [1, 2, 3].every(async n => n > 100));    // true
автор: NagarD

У прикладі перевіряється, чи всі елементи масиву більші або рівні 10. Результат першого прикладу буде false, оскільки є елементи (5 та 8), які менші за 10. Результат другого прикладу буде true, оскільки всі елементи масиву більші або рівні 10.

function isBigEnough(element, index, array) {
  return element >= 10;
}

const array1 = [12, 5, 8, 130, 44];
const array2 = [12, 54, 18, 130, 44];

const result1 = array1.every(isBigEnough); // false
const result2 = array2.every(isBigEnough); // true

console.log(result1);
console.log(result2);
автор: Bond

У прикладі перевіряється, чи всі елементи одного масиву присутні у другому масиві. Результат першого прикладу буде true, оскільки всі елементи масиву [5, 7, 6] присутні у масиві [1, 2, 3, 4, 5, 6, 7]. Результат другого прикладу буде false, оскільки масив [5, 8, 7] містить елементи, які не присутні у масиві [1, 2, 3, 4, 5, 6, 7].

const isSubset = (array1, array2) =>
  array2.every((element) => array1.includes(element));

console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 7, 6])); // true
console.log(isSubset([1, 2, 3, 4, 5, 6, 7], [5, 8, 7])); // false
автор: Bond

Метод every() не виконує передану умову для порожніх слотів. У першому прикладі результат буде true, оскільки умова (x) => x !== undefined виконується для всіх елементів масиву [1, , 3], крім порожнього слоту, який є в масиві. У другому прикладі результат також буде true, оскільки умова (x) => x === 2 виконується для всіх елементів масиву [2, , 2], крім порожнього слоту.

console.log([1, , 3].every((x) => x !== undefined)); // true
console.log([2, , 2].every((x) => x === 2)); // true
автор: Bond

У першому прикладі цикл виконується 3 ітерації, оскільки масив модифікується на кожній ітерації. У другому прикладі цикл також виконується 3 ітерації, навіть після додавання нових елементів. У третьому прикладі цикл виконується лише 2 ітерації, оскільки решта елементів видаляється за допомогою pop().

// ---------------
// Зміна елементів
// ---------------
let arr = [1, 2, 3, 4];
arr.every((elem, index, arr) => {
  arr[index + 1]--;
  console.log(`[${arr}][${index}] -> ${elem}`);
  return elem < 2;
});

// Цикл виконується 3 ітерації, але без змін цикл би виконався 2 ітерації
//
// 1-а ітерація: [1,1,3,4][0] -> 1
// 2-а ітерація: [1,1,2,4][1] -> 1
// 3-я ітерація: [1,1,2,3][2] -> 2

// ---------------
// Додавання елементів
// ---------------
arr = [1, 2, 3];
arr.every((elem, index, arr) => {
  arr.push("новий");
  console.log(`[${arr}][${index}] -> ${elem}`);
  return elem < 4;
});

// Цикл виконується 3 ітерації, навіть після додавання нових елементів
//
// 1-а ітерація: [1, 2, 3, новий][0] -> 1
// 2-а ітерація: [1, 2, 3, новий, новий][1] -> 2
// 3-я ітерація: [1, 2, 3, новий, новий, новий][2] -> 3

// ---------------
// Видалення елементів
// ---------------
arr = [1, 2, 3, 4];
arr.every((elem, index, arr) => {
  arr.pop();
  console.log(`[${arr}][${index}] -> ${elem}`);
  return elem < 4;
});

// Цикл виконується лише 2 ітерації, оскільки решта
// елементів видаляється за допомогою `pop()`
//
// 1-а ітерація: [1,2,3][0] -> 1
// 2-а ітерація: [1,2][1] -> 2
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід