В этом руководстве вы узнаете, как использовать метод JavaScript Array filter() для фильтрации элементов в массиве.
Одной из наиболее распространенных задач при работе с массивом является создание нового массива, содержащего подмножество элементов исходного массива.
Предположим, у вас есть массив объектов города, где каждый объект содержит два свойства: name и population.
let cities = [
{name: 'Los Angeles', population: 3792621},
{name: 'New York', population: 8175133},
{name: 'Chicago', population: 2695598},
{name: 'Houston', population: 2099451},
{name: 'Philadelphia', population: 1526006}
];Чтобы найти город с населением более 3 миллионов человек, вы обычно перебираете элементы массива с помощью цикла for и проверяете, удовлетворяет ли значение свойства population условию, например так:
let bigCities = [];
for(let i = 0; i < cities.length; i++) {
if(cities[i].population > 3000000) {
bigCities.push(cities[i]);
}
}
console.log(bigCities);Выход:
[
{ name: 'Los Angeles', population: 3792621 },
{ name: 'New York', population: 8175133 }
]Массив JavaScript предоставляет метод filter(), который позволяет вам выполнить эту задачу более коротким и четким способом.
В следующем примере возвращается тот же результат, что и в приведенном выше примере:
let bigCities = cities.filter(function(e) {
return e.population > 3000000;
});
console.log(bigCities);В этом примере мы вызываем метод filter() объекта массива cities и передаем функцию, которая проверяет каждый элемент.
Внутри функции мы проверяем, превышает ли population каждого города в массиве 3 миллиона человек. Если это так, функция возвращает true или false в противном случае.
Метод filter() включает в результирующий массив только те элементы, которые удовлетворяют требованиям функции обратного вызова.
Начиная с ES6, вы можете использовать функцию стрелки, чтобы сделать ее более лаконичной:
let bigCities = cities.filter(city => city.population > 3000000); console.log(bigCities);
Метод в деталях
Синтаксис:
arrayObject.filter(callback, contextObject);
Метод filter() создает новый массив со всеми элементами, прошедшими проверку, реализованную функцией callback().
Внутри метод filter() перебирает каждый элемент массива и передает каждый элемент функции callback. Если функция callback возвращает значение true, она включает элемент в возвращаемый массив.
Метод
filter()принимает два именованных аргумента: функциюcallbackи необязательный объект.
Как и другие итерационные методы объекта Array, такие как every(), some(), map() и forEach(), функция callback имеет следующую форму:
function callback(currentElement, index, array){
// ...
}Функция callback принимает три аргумента:
- Аргумент
currentElement— это текущий элемент массива, который обрабатывается функциейcallback. indexcurrentElement, который обрабатывается функциейcallback.- Проходимый объект
array.
Аргументы index и array необязательны.
Аргумент contexObject метода filter() является необязательным. Если вы передадите this значение, вы можете сослаться на него, используя ключевое слово this внутри функции callback.
Важно отметить, что метод не изменяет исходный массив.
Другие примеры
Поскольку метод filter() возвращает новый массив, вы можете связать результат с другими методами массива, такими как sort() и map().
Например, ниже показано, как объединить три метода: filter(),sort(), и map():
cities
.filter(city => city.population < 3000000)
.sort((c1, c2) => c1.population - c2.population)
.map(city => console.log(city.name + ':' + city.population));
Выход:
Philadelphia:1526006 Houston:2099451 Chicago:2695598
Как это работает.
- Во-первых, отфильтруйте города с населением менее 3 миллионов человек, используя метод
filter(). - Во-вторых, отсортируйте полученные города по населению в порядке убывания, используя метод
sort(). - В-третьих, выведите элемент массива на консоль с помощью метода
map().
В следующем примере показано использование аргумента contextObject, указывающего объект, на который можно сослаться в функции callback() с использованием ключевого слова this.
function isInRange(value) {
if(typeof value !== 'number') {
return false;
}
return value >= this.lower && value <= this.upper;
}
let data = [10, 20, "30", 1, 5, 'JavaScript filter', undefined, 'example'];
let range = {
lower: 1,
upper: 10
};
let numberInRange = data.filter(isInRange, range);
console.log(numberInRange); // [10, 1, 5]Выход:
[ 10, 1, 5 ]
Как это работает.
- Во-первых, определите
isInRange(), которая проверяет, является ли ее аргумент числом и находится ли он в диапазоне, заданномlowerиupperсвойствами объекта. - Затем определите массив смешанных данных, который содержит числа, строки и неопределенные значения.
- Затем определите объект
rangeс двумя свойствами:lowerиupper. - После этого вызовите методы
filter()массиваdataи передайтеisInRange()и объектrange. Поскольку мы передаем объектrange, внутри функцииisInRange()ключевое словоthisссылается на объектrange. - Наконец, покажите массив результатов в консоли.
