Метод filter() создаёт новый массив из элементов, прошедших проверку условия. Исходный массив не изменяется.
Синтаксис
let newArr = oldArr.filter(callback);
Параметры callback-функции: element — текущий элемент, index — индекс, arr — исходный массив.
Filter vs. For Loop
Традиционный подход — перебор с условием:
let arr = [1, 2, 3, 4, 5, 6];
let even = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) even.push(arr[i]);
}
// even = [2, 4, 6]
То же самое через filter():
let even = arr.filter(val => val % 2 === 0); // even = [2, 4, 6]
Фильтрация объектов
Фильтрация стран по населению свыше 500 миллионов:
let data = [
{ country: 'China', population: 1409517397 },
{ country: 'India', population: 1339180127 },
{ country: 'USA', population: 324459463 },
{ country: 'Indonesia', population: 263991379 }
];
let bigCountries = data.filter(val => val.population > 500000000);
// [{ country: 'China', ... }, { country: 'India', ... }]
Фильтрация вложенных структур
Для фильтрации по вложенным массивам используйте метод some():
function getResourcesByCategoryName(Resources, CategoryName) {
return Resources.filter(function(resource) {
return resource.categories
.some(function(category) {
return category.name == CategoryName;
});
});
}
Метод some() возвращает true, если хотя бы один элемент вложенного массива удовлетворяет условию — именно то, что нужно для фильтра.