Перейти до основного вмісту

Метод filter()

Метод filter(callback) використовується для єдиної операції - фільтрації масиву, тобто, коли необхідно вибрати більше одного елемента з колекції за певним критерієм.

масив.filter((element, index, array) => {
// Тіло колбек-функції
});
  • Не змінює оригінальний масив.
  • Поелементо перебирає оригінальний масив.
  • Повертає новий масив.
  • Додає у масив, що повертається, елементи, які задовольняють умови колбек-функції.
  • Якщо колбек повернув true, елемент додається у масив, що повертається.
  • Якщо колбек повернув false, елемент не додається у масив, що повертається.
  • Якщо жоден елемент не задовольнив умову, повертає порожній масив.
const values = [51, -3, 27, 21, -68, 42, -37];

const positiveValues = values.filter(value => value >= 0);
console.log(positiveValues); // [51, 27, 21, 42]

const negativeValues = values.filter(value => value < 0);
console.log(negativeValues); // [-3, -68, -37]

const bigValues = values.filter(value => value > 1000);
console.log(bigValues); // []

// Оригінальний масив не змінився
console.log(values); // [51, -3, 27, 21, -68, 42, -37]

Тобто метод filter викликає колбек-функцію для кожного елемента вихідного масиву і, якщо результат її виконання - true, додає поточний елемент у новий масив.

Фільтрація унікальних елементів

Використовуючи метод filter(), можна виконати фільтрацію масиву таким чином, що у ньому залишаться тільки унікальні елементи. Цей прийом працює тільки з масивом примітивних значень - не об'єктів.

Повернемося до групи студентів і масиву усіх відвідуваних предметів, які ми отримали методом flatMap().

const students = [
{ name: "Манго", courses: ["математика", "фізика"] },
{ name: "Полі", courses: ["інформатика", "математика"] },
{ name: "Ківі", courses: ["фізика", "біологія"] },
];

const allCourses = students.flatMap(student => student.courses);
// ['математика', 'фізика', 'інформатика', 'математика', 'фізика', 'біологія'];

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

const uniqueCourses = allCourses.filter(
(course, index, array) => array.indexOf(course) === index
);

Використовуючи array.indexOf(course), виконуємо пошук першого збігу поточного елемента course і отримуємо його індекс в оригінальному масиві усіх курсів. В параметрі index зберігається індекс поточного елемента course, перебираючи масив методом filter.

Якщо результат indexOf() і значення index рівні - це унікальний елемент, тому що таке значення зустрічається в масиві вперше, і на поточній ітерації фільтр обробляє саме його.

# Масив усіх курсів
['математика', 'фізика', 'інформатика', 'математика', 'фізика', 'біологія'];

Для елемента 'математика' під індексом 0:

  • indexOf() поверне 0, тому що шукає перший збіг.
  • Значення параметра index буде 0.
  • Вони рівні, а отже, це унікальний елемент.

Для елемента 'математика' під індексом 3:

  • indexOf() поверне 0, тому що шукає перший збіг.
  • Значення параметра index буде 3.
  • Вони не рівні, а отже, це повторюваний - не унікальний елемент.

Масив об'єктів

Під час роботи з масивом об'єктів виконується фільтрація за значенням певної властивості. У підсумку, утворюється новий масив відфільтрованих об'єктів.

Наприклад, у нас є масив студентів з балами за тест. Необхідно відфільтрувати кращих (бал вище 80), гірших (бал нижче 50) і середніх студентів (бал від 50 до 80).

const LOW_SCORE = 50;
const HIGH_SCORE = 80;
const students = [
{ name: "Манго", score: 83 },
{ name: "Полі", score: 59 },
{ name: "Аякс", score: 37 },
{ name: "Ківі", score: 94 },
{ name: "Х'юстон", score: 64 },
];

const best = students.filter(student => student.score >= HIGH_SCORE);
console.log(best); // Масив об'єктів з іменами Манго і Ківі

const worst = students.filter(student => student.score < LOW_SCORE);
console.log(worst); // Масив з одним об'єктом Аякс

// В колбек-функції зручно деструктуризувати властивості об'єкта
const average = students.filter(
({ score }) => score >= LOW_SCORE && score < HIGH_SCORE
);
console.log(average); // Масив об'єктів з іменами Полі і Х'юстон