Существует множество информации и видеороликов о том, как применять метод filter(), но, как мы знаем, лучшее обучение происходит при самостоятельном кодировании и экспериментировании. Так что давайте погрузимся…
const newArray = array.filter(function(element) {
return //conditional statement
})
console.log(newArray)
//=> returns array with filtered elements
Метод filter() принимает функцию обратного вызова, содержащую критерии поиска, используемые для фильтрации целевого массива. Каждый элемент целевого массива пропускается через функцию обратного вызова в поисках истинного значения, после чего возвращается новый массив элементов, которые оказались истинными. Если ни один элемент не соответствует истине, то filter() вернет пустой массив. Этот метод является неразрушающим, поскольку он не мутирует исходный массив.
Необязательными параметрами для этого метода являются index (если вы хотите начать итерацию с определенной точки массива) и thisArg, о которых вы можете прочитать здесь.
Используя тот же синтаксис, что и выше, давайте напишем простой условный оператор.
const myArray = [ 3, 2, 1, "go", 1]
const numArray = myArray.filter(function(element){
return element > 1
})
console.log(numArray)
//=> [3, 2]
Это было просто, верно? Есть более простые/чистые способы написать этот код, но в целях обучения мне нравится видеть детали! Далее приведены некоторые данные, которые вы можете использовать, чтобы следовать за вами или создать свой собственный код filter().
Если бы вы сказали мне, что однажды я буду набирать данные персонажей The Office, чтобы попрактиковаться в кодировании, я бы рассмеялся, но вот он я!!! И да, я обнаружил, что некоторые фанаты вычислили возраст персонажей на основе случайных кусочков информации из сериала.
const officeCharacters = [
{
character: "Michael Scott",
gender: "male",
age: 40,
job: "Branch Manager"
},
{
character: "Dwight Schrute",
gender: "male",
age: 35,
job: "Salesman"
},
{
character: "Pam Beesly",
gender: "female",
age: 26,
job: "Receptionist"
},
{
character: "Jim Halpert",
gender: "male",
age: 26,
job: "Salesman"
}
]
Используя тот же синтаксис, что и выше, мы хотим вернуть массив только мужских персонажей, отфильтровав значения пола персонажей. Поскольку предоставленные данные представляют собой массив объектов, нам понадобится использовать точечную нотацию для доступа к значениям ключей.
const maleCharacters = officeCharacters.filter(function(char) {
return char.gender === "male"
})
console.log(maleCharacters)
//=> returns new array with only the male characters
Прости, Пэм!
Теперь давайте отфильтруем персонажей моложе 40 лет. На этот раз с помощью стрелочной функции и задав условие меньше или равно 39.
const ageBelowForty = officeCharacters.filter(char => char.age <= 39)
console.log(ageBelowForty)
Здесь мы видим возвращаемый массив ageBelowForty в консоли браузера.
Если вы похожи на меня… вы, вероятно, думаете, что возраст и пол — не самые лучшие фильтры для сотрудников, поэтому вот еще один, та же идея, но фильтрация по должности…
const salesEmployees = officeCharacters.filter(char => char.job === "Salesman")
console.log(salesEmployees)
//=> returns array of 2 salesman
Как насчет нескольких условий? ДА. Давайте попробуем…
const filterCharacters = officeCharacters.filter(char => {
return char.age >= 30 && char.gender === "male"
})
console.log(filterCharacters)
//=> returns an array of 2 characters (Michael and Dwight)
Допустим, мы не уверены, что ищем, но знаем, чего не хотим. Попробуйте использовать оператор !==.
Это лишь упрощенный вариант начала фильтрации. Представляете, как это удобно для больших массивов объектов? Существует множество различных способов написания условий, что делает .filter() хорошим помощником в JavaScript.
-
Если вам нужно отфильтровать массив для одного конкретного элемента, попробуйте метод .find(). Этот метод возвращает первый элемент, который принимает значение true.
-
Не уверены, что работаете с массивом? Ознакомьтесь с методом .isArray() на MDN. Метод .filter() работает только с массивами (включая массивы объектов, как описано выше) и при неправильном применении выдаст сообщение об ошибке.
Я знаю, что «salesman» устарело и должно быть sales representative, но это название должности, используемое в шоу. IYKYK
Вы можете связаться со мной на LinkedIn & GitHub
Ресурсы: MDN, Eloquent Javascript, w3schools, Canva