У меня есть один объект списка продуктов, и я создал один массив, чтобы применить функцию фильтра, чтобы получить параметр из этого массива. Как ниже

var selectedProducts = ['music', 'dance'] var products = [ { ID : 1, name : "pro1", category : "music" }, { ID : 2, name : "pro2", category : "yoga" }, { ID : 3, name : "pro3", category : "music" }, { ID : 4, name : "pro4", category : "dance" }, ] function filterFunction(){ return products.filter((abc) ={amp}gt; { selectedProducts.forEach(function(item, index){ return abc.category == selectedProducts[index] }); }); } 

То, что я пытаюсь сделать, это когда пользователь выбирает какой-либо флажок, выбранные значения будут сохранены в массиве selectedProducts [], а затем для этих значений будет вызвана функция фильтра и массив будет передан как параметр для метода forEach. Код прекрасно работает на каждой итерации цикла, но в конце он возвращает пустой массив объекта. Что-то не так с моим кодом?

Возвращение true из функции обратного вызова вашего цикла forEach() не повлияет на состояние фильтра.

Вот альтернативный подход с использованием Array.prototype.includes() :

 products.filter(({category}) ={amp}gt; selectedProducts.includes(category)); 

Полный фрагмент:

 const selectedProducts = ['music', 'dance'] const products = [ { ID : 1, name : "pro1", category : "music" }, { ID : 2, name : "pro2", category : "yoga" }, { ID : 3, name : "pro3", category : "music" }, { ID : 4, name : "pro4", category : "dance" }, ] function filterFunction(){ return products.filter(({category}) ={amp}gt; selectedProducts.includes(category)); } console.log(filterFunction()); 

Используйте комбинацию filter и some :

 function filterFunction(){ return products.filter((abc) ={amp}gt; { return selectedProducts.some(function(category){ return abc.category === category; }); }); } 

Функция some() возвращает true если хотя бы один из selectedProducts продуктов соответствует category abc .

Мы также можем использовать includes :

 function filterFunction(){ return products.filter((abc) ={amp}gt; { return selectedProducts.includes(abc.category); }); } 

При разработке веб-интерфейса я предпочитаю использовать комбинацию filter и some , потому что эти функции поддерживаются шире, чем includes (работа с большим количеством версий браузера).

Refs:

Array.prototype.filter

Array.prototype.some

Array.prototype.includes