Как работает метод filter() в JavaScript
Содержание
Что такое метод filter() в JavaScript
Этот инструмент применяется к массиву и служит для фильтрации его контента. Примененный к содержимому массива, filter()
не вносит изменений в исходный объект. Вместо этого генерируется другой массив.
В него помещается содержимое, которое соответствует условиям, указанным в коллбэк (эта функция передается в качестве параметра метода). Иными словами, мы создаем фильтр, который отсеивает для другого массива ненужные элементы.
Синтаксиc для метода filter()
Общий вид записи метода выглядит так:
myArray.filter(условие фильтрации);
myArray.filter(callbackName, conObject);
myArray.filter(callbackfunctionName(element, index, array) {...}, conObject);
Где:
conObject
— объект для указания дополнительного контекста фильтрации, такого как данные или набор данных;
myArray
— перебираемый массив;
index
— индекс элемента массива myArray;
element
— компонент массива, обрабатываемый filter()
.
Если записать через стрелочную функцию, вид станет компактнее:
myArray.filter(element => условие фильтрации);
Параметры метода
Напомним, коллбэк — это любая функция, которая передается как аргумент другой функции. Коллбэк в filter()
поддерживает следующие аргументы:
- значение отдельного компонента группы;
- индекс компонента;
- массив, который необходимо фильтровать.
Варианты применения filter()
Отбор по значениям
Рассмотрим задачу. Есть товар, который обладает следующими свойствами: весом (weight
) и названием (vendor
). На основании этой информации мы имеем дело с массивом products
:
const products = [ {vendor: 'Vendor1', weight: 2}, {vendor: 'Vendor2', weight: 5}, {vendor: 'Vendor3', weight: 14}, {vendor: 'Vendor4', weight: 11}, {vendor: 'Vendor5', weight: 12}, {vendor: 'Vendor6', weight: 8} ];
Предположим, мы хотим отсортировать товар, который весит не более 11 и вывести его в новый массив newProductsList
. В принципе мы можем обойтись и без метода фильтрации. Для этого можно просто создать цикл:
const newProductsList = []; for (let i = 0; i < products.length; i++) { if (products[i].weight < 12) { newProductsList.push(products[i]); } } console.log(newProductsList);
Но использование рассматриваемого метода существенно упрощает задачу:
const newProductsList2 = products.filter(function(item) { return item.weight < 12; }); console.log(newProductsList2);
Коллбэк-функция проверяет элементы, если она возвращает true после обнаружения соответствия, то такой элемент помещается в новый массив newProductsList2
. Если же возвращается false — ничего не происходит.
При помощи альтернативной записи можно сделать код еще короче:
newProductsList3 = products.filter(e => e.weight < 12); console.log(newProductsList3);
Нахождение всех простых чисел в массиве
Иногда требуется применить несколько условий одновременно. Чтобы новый массив соответствовал сразу нескольким условиям можно писать так:
return x>=0 && x<=4 && index%2==0;
При этом в новую группу попадут только четные индексы, значения которых от 0 до 4 включительно.
Чтобы определить, какие числа в группе простые, мы должны проитерировать по элементам, применив к каждому из них проверку — делится ли это число только на единицу и само на себя.
Это реализуется следующим образом:
const randomarray = [-311, -32, -1, 0, 1, 22, 23, 24, 75, 86, 47, 85, 96, 170, 1431, 1571, 1723]; function searchingPrime(element) { for (let j = 2; element > j; j++) { if (element % j == 0) { return false; } } return element > 1; } console.log(randomarray.filter(searchingPrime)); //[ 23, 47, 1571, 1723 ]
Отсеивание нежелательных полей в JSON
При получении данных через файл JSON часто возникает необходимость выполнить фильтрацию полученной информации. Это можно выполнить с помощью метода filter()
.
Ниже приведен сценарий такой обработки массива, где оставляются только корректные значения id
:
let fields = [ { id: 17 }, { id: -6 }, { id: null }, { }, { id: 0 }, { id: 8 }, { id: 13.4 }, { id: 'err'}, { id: 'undefined' } ] let uncorrectEntries = 0 function filterID(item) { if (Number.isFinite(item.id) && item.id !== 0) { return true } uncorrectEntries++ return false; } let fieldsByID = fields.filter(filterID) console.log('Корректная структура полей\n', fieldsByID) // Корректная структура полей // [ { id: 17 }, { id: -6 }, { id: 8 }, { id: 13.4 } ] console.log('\nЧисло ошибочных элементов = ', uncorrectEntries) // Число ошибочных элементов = 5
Поиск элементов массива
Наиболее очевидное применение рассматриваемого инструмента фильтрации — поиск. Когда требуется найти слова в массиве по ключевому запросу, мы можем применить filter()
с указанием критерия поиска:
let words = ['Highload', 'today', 'oddity', 'HIMARS', 'Caesar','Caesar','army']; /** *Сортировка по правилам поискового запроса (myquery) */ function filterItems(myquery) { return words.filter(function(el) { return el.toLowerCase().indexOf(myquery.toLowerCase()) > -1; }) } console.log(filterItems('hi')); // [ 'Highload', 'HIMARS' ] console.log(filterItems('ar')); // [ 'HIMARS', 'Caesar', 'Caesar', 'army' ]
Применение filter() в разреженных массивах
Разреженными называются те массивы, в которых имеются позиции, не занятые элементами. Когда компоненты такого массива опущены, у нас есть проблема — память для элементов выделена и происходит ее утечка. С проблемой приходится бороться разными способами и один из вариантов ее устранения — применение метода filter()
.
Этот инструмент фильтрации отсеивает пустые элементы в разреженных массивах и возвращают уже уплотненную структуру. Для просеивания разреженного массива нужно выполнить код:
var dense = sparse.filter(function() { return true; });
Для уплотнения структуры и устранения позиций с undefined
и null
можно также применять инструмент filter()
:
somearray = somearray.filter(function(x) { return х !== undefined && х != null; });
Редактирование массива (коррекция значений, добавление и удаление элементов)
Рассмотрим несколько сценариев редактирования набора элементов с использованием метода filter()
.
Внесение изменений в элементы массива:
let originalwords = ['today', 'unlimit', 'awesome', 'definitely', 'Oh', 'yesterday'] const newmodifiedWords = originalwords.filter( (word, index, arr) => { arr[index+1] +=' high' return word.length < 8 }) console.log(newmodifiedWords)
Отметим, что в нашей группе слов присутствуют четыре слова с длиной менее 8. Но поскольку они были отредактированы, на выходе мы получаем лишь два элемента: today
и Oh high
.
Теперь посмотрим, как выглядит пример добавления новых значений к уже существующим:
mywords = ['ray', 'cat', 'bass', 'awesome','wednesday', 'futurama'] const addedWords = mywords.filter( (word, index, arr) => { arr.push('work') return word.length< 5 }) console.log(addedWords)
В этом случае лишь три элемента соответствуют условию, хотя массив, после внесения изменений, включает намного больше элементов менее пяти символов: [ 'ray', 'cat', 'bass' ]
.
Пример удаления элементов:
listwords = ['Highload', 'today', 'news', 'editor', 'futurama', 'none'] console.log(listwords, 'исходное содержимое') const excludeWords = listwords.filter( (slovo, index, lst) => { lst.pop() return slovo.length < 6 }) console.log(listwords, 'содержимое после обработки ') //[ 'Highload', 'today', 'news' ] console.log(excludeWords, 'слова с числом символов менее шести') //[ 'today', 'news' ]
Заметьте, что здесь слово `none`
не учитывается, поскольку удалено из `listwords`
до того, как фильтр мог быть к нему применен.
Заключение
Теперь вы знаете, для чего нужен метод filter()
и как его использовать в операциях с наборами элементов:
- инструмент применяется к массиву и служит для фильтрации его контента;
- не вносит изменений в исходный объект — вместо этого генерируется другой массив.
Для закрепления материала мы рекомендуем вам посмотреть обучающее видео, рассказывающее о методе для фильтрации в JavaScript:
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: