Пошук уроків, статей та іншого контенту
Методи для перевірки наявності елементів та їхньої відповідності умові без ручних циклів.
filter завжди повертає масив, навіть якщо шукаєте лише один елемент чи просто хочете знати, чи є щось, що відповідає умові. Це не лише зайва робота — for...of з ручним break, як у прикладі з попереднього модуля, теж працює, але методи пошуку роблять намір коду одразу зрозумілим із самої назви.
find повертає сам елемент (не масив) — перший, для якого колбек повернув truthy, або undefined, якщо такого немає:
const users = [
{ id: 1, name: "Олена", role: "user" },
{ id: 2, name: "Максим", role: "admin" },
];
const admin = users.find((user) => user.role === "admin");
admin; // { id: 2, name: "Максим", role: "admin" }
const missing = users.find((user) => user.role === "guest");
missing; // undefinedТой самий принцип, але повертає індекс (або -1, якщо не знайдено) замість самого елемента — корисно, коли далі потрібно змінити чи видалити елемент за позицією:
const index = users.findIndex((user) => user.id === 2);
index; // 1some повертає булеве значення: чи хоча б один елемент відповідає умові:
const hasAdmin = users.some((user) => user.role === "admin");
hasAdmin; // true — достатньо одного adminevery повертає true лише якщо умові відповідають абсолютно всі елементи:
const allActive = users.every((user) => user.active);
// false, якщо хоча б один user.active дорівнює falseВажливий нюанс: every на порожньому масиві завжди повертає true (вважається, що умова «виконана для всіх нуля елементів»), а some на порожньому масиві завжди повертає false. Це математичне визначення, яке варто пам'ятати — воно іноді дає неочікувані результати на порожніх вхідних даних.
Коли потрібно перевірити наявність конкретного примітивного значення (не об'єкта, не за умовою), includes коротший за some:
const roles = ["user", "admin", "editor"];
roles.includes("admin"); // true
// includes використовує строге порівняння (як ===), тому для об'єктів
// не спрацює, навіть якщо вміст однаковий — там потрібен find або some:
[{ id: 1 }].includes({ id: 1 }); // false — це різні об'єкти в пам'ятіconst fields = [
{ name: "email", value: "test@example.com" },
{ name: "password", value: "" },
];
const hasEmptyField = fields.some((field) => field.value.trim() === "");
const allFilled = fields.every((field) => field.value.trim() !== "");
hasEmptyField; // true
allFilled; // falsefind — потрібен сам елемент (перший відповідний).
findIndex — потрібна позиція елемента.
some — потрібно знати, чи є хоча б один відповідний елемент (булеве значення).
every — потрібно перевірити, що умові відповідають усі елементи (булеве значення).
includes — швидка перевірка наявності конкретного примітивного значення.
filter — потрібні всі відповідні елементи як новий масив.
Використання filter(...)[0] замість find, коли потрібен лише перший елемент — filter завжди перебирає весь масив, find зупиняється на знахідці.
Використання includes для масиву об'єктів — порівняння за посиланням майже завжди дасть false.
Плутанина some і every — some «хоча б один», every «абсолютно всі».
find і findIndex шукають конкретний елемент чи позицію, some і every перевіряють масив на відповідність умові й повертають булеве значення, includes — найпростіша перевірка наявності примітивного значення. Разом із map/filter/reduce з попереднього уроку це покриває практично всі типові операції з масивами без єдиного ручного циклу.
Спробуйте самостійно
Маючи масив завдань const tasks = [{ text: "Купити хліб", done: true }, { text: "Прибрати", done: false }], напишіть вираз, який визначає, чи всі завдання виконані, і окремий вираз, який знаходить перше невиконане завдання.