Как отфильтровать массив в JavaScript — оставить только нужные элементы?
Есть массив чисел, хочу оставить только чётные. Или массив объектов — оставить только активных пользователей. Слышал про filter, но не до конца понял, как отфильтровать массив и что именно возвращать из функции.
2 ответа
filter создаёт новый массив из тех элементов, для которых твоя функция вернула true.
Главное — в колбэке вернуть условие (булево значение), а не сам элемент:
const nums = [1, 2, 3, 4, 5, 6];
const even = nums.filter(n => n % 2 === 0);
console.log(even); // [2, 4, 6]
С объектами так же — пишешь условие по полю:
const users = [
{ name: 'Аня', active: true },
{ name: 'Боб', active: false },
{ name: 'Вера', active: true }
];
const activeUsers = users.filter(u => u.active);
console.log(activeUsers.length); // 2
Исходный массив не меняется — filter, как и map, возвращает копию.
Частая ошибка новичков: забыть return в фигурных скобках.
// неправильно — ничего не вернули, отфильтруется ПУСТОЙ массив
nums.filter(n => { n % 2 === 0 });
// правильно
nums.filter(n => { return n % 2 === 0; });
// или без скобок — стрелка возвращает сама
nums.filter(n => n % 2 === 0);
Если стрелка без фигурных скобок — значение возвращается автоматически. Как только поставил { }, нужен явный return.
Подсказка: filter отвечает на вопрос «оставить элемент или нет», а map — «во что его превратить». Их часто путают.
Если нужно и отфильтровать, и преобразовать — сцепи их:
const nums = [1, 2, 3, 4, 5];
const res = nums.filter(n => n > 2).map(n => n * n);
console.log(res); // [9, 16, 25]