Фильтрация массива в JavaScript
- Что такое фильтрация массива
- Метод filter()
- Условие в callback-функции
- Фильтрация массива объектов
- Если ничего не подошло
- filter() не меняет исходный массив
- filter() или find()
- Итого
Фильтрация массива нужна, когда из массива нужно оставить только те элементы, которые подходят под условие.
let numbers = [1, 2, 3, 4, 5, 6];
let evenNumbers = numbers.filter((number) => number % 2 === 0);
console.log(evenNumbers); // [2, 4, 6]
В этом примере в новый массив попали только четные числа.
Что такое фильтрация массива
Фильтрация не изменяет элементы, а отбирает их. Часть элементов остается, часть отбрасывается.
Например, есть список цен, а нужно оставить только цены больше 1000.
let prices = [500, 1200, 800, 3000];
let expensivePrices = prices.filter((price) => price > 1000);
console.log(expensivePrices); // [1200, 3000]
Если нужно не отобрать элементы, а изменить каждый элемент, тогда обычно нужен map(), а не filter().
Метод filter()
filter() перебирает массив и вызывает callback-функцию для каждого элемента.
Если callback-функция возвращает true, элемент попадает в новый массив. Если возвращает false, элемент пропускается.
let ages = [16, 21, 18, 14, 30];
let adults = ages.filter((age) => {
return age >= 18;
});
console.log(adults); // [21, 18, 30]
Метод возвращает новый массив с подходящими элементами.
Условие в callback-функции
В callback-функции обычно пишут проверку. Она должна вернуть результат проверки.
let words = ['кот', 'машина', 'дом', 'программирование'];
let longWords = words.filter((word) => word.length > 5);
console.log(longWords); // ['машина', 'программирование']
Если используете фигурные скобки, не забывайте return.
let longWords = words.filter((word) => {
return word.length > 5;
});
Без return функция вернет undefined, и элементы не пройдут фильтр.
Фильтрация массива объектов
Часто фильтруют не числа и строки, а массив объектов. Например, нужно оставить только активных пользователей.
let users = [
{ name: 'Анна', active: true },
{ name: 'Олег', active: false },
{ name: 'Мария', active: true },
];
let activeUsers = users.filter((user) => user.active);
console.log(activeUsers);
Здесь user.active уже содержит true или false, поэтому отдельное сравнение можно не писать.
let activeUsers = users.filter((user) => user.active === true);
Так тоже будет работать, но в такой ситуации короткая запись обычно читается нормально.
Если ничего не подошло
Если ни один элемент не прошел проверку, filter() вернет пустой массив.
let prices = [100, 200, 300];
let expensivePrices = prices.filter((price) => price > 1000);
console.log(expensivePrices); // []
Это нормальное поведение. Пустой массив означает, что подходящих элементов нет.
filter() не меняет исходный массив
filter() создает новый массив и не меняет исходный.
let numbers = [1, 2, 3, 4];
let evenNumbers = numbers.filter((number) => number % 2 === 0);
console.log(numbers); // [1, 2, 3, 4]
console.log(evenNumbers); // [2, 4]
Это удобно, когда нужно сохранить исходные данные и отдельно получить отфильтрованный результат.
filter() или find()
filter() нужен, когда нужно получить все подходящие элементы.
let users = [
{ id: 1, name: 'Анна', role: 'admin' },
{ id: 2, name: 'Олег', role: 'user' },
{ id: 3, name: 'Мария', role: 'admin' },
];
let admins = users.filter((user) => user.role === 'admin');
console.log(admins);
Если нужен только один первый подходящий элемент, лучше использовать find().
let user = users.find((user) => user.id === 2);
console.log(user); // { id: 2, name: 'Олег', role: 'user' }
Проще правило такое: нужен массив результатов - используйте filter(), нужен один элемент - используйте find().
Итого
1. Фильтрация массива оставляет только элементы, которые подходят под условие.
2. Для фильтрации используют метод filter().
3. Callback-функция должна вернуть true или false.
4. filter() возвращает новый массив и не меняет исходный.
5. Если нужен один элемент, чаще подходит find(), а не filter().