Вы можете фильтровать продукты итерациями для каждого фильтра с помощью reduce
(начиная с всего массива продуктов в качестве начального аккумулятора и возвращая отфильтрованную версию после применения каждого фильтра).
Кроме того, поскольку вы были открыты для изменения структуры ваших объектов, я сделал несколько небольших изменений (убрав id
из ключа fabricColor
в продуктах и добавив его в patternGroupCode
фильтр объекта) просто чтобы быть последовательным.
function multiFilter(array, filters) {
return Object.entries(filters).reduce((acc, [k, kFilters]) => {
let isFiltered = new Set(kFilters.filter(f => f.isFiltered).map(f => f.id)),
other = kFilters.some(f => f.id === 'OTHER' && f.isFiltered),
notFiltered = new Set(kFilters.filter(f => !f.isFiltered).map(f => f.id));
return acc.filter(p => other ? !notFiltered.has(p[k]) : isFiltered.has(p[k]));
}, array);
}
let products = [{
name: "A",
fabricColor: 'BLUE',
patternGroupCode: 'PLAID',
size: 50
},
{
name: "B",
fabricColor: 'BLUE',
patternGroupCode: 'WINDOWPANE',
size: 60
},
{
name: "C",
fabricColor: 'BLUE',
patternGroupCode: 'SOLID',
size: 100
},
{
name: "D",
fabricColor: 'BLACK',
patternGroupCode: 'PLAID',
size: 70
},
{
name: "E",
fabricColor: 'BLACK',
patternGroupCode: 'WINDOWPANE',
size: 80
},
{
name: "F",
fabricColor: 'BLACK',
patternGroupCode: 'SOLID',
size: 100
},
{
name: "G",
fabricColor: 'GREEN',
patternGroupCode: 'PLAID',
size: 90
},
{
name: "H",
fabricColor: 'GREEN',
patternGroupCode: 'SOLID',
size: 100
},
{
name: "I",
fabricColor: 'GREEN',
patternGroupCode: 'WINDOWPANE',
size: 80
},
{
name: "I",
fabricColor: 'GREEN',
patternGroupCode: 'PAISLEY',
size: 80
}
];
let filters = {
fabricColor: [{
"id": 'BLACK',
"isFiltered": true
}, {
"id": 'BLUE',
"isFiltered": false
}, {
"id": 'OTHER',
"isFiltered": true
}],
patternGroupCode: [{
"id": 'OTHER',
"isFiltered": true
},
{
"id": 'STRIPES',
"isFiltered": false
},
{
"id": 'PLAID',
"isFiltered": true
},
{
"id": 'PAISLEY',
"isFiltered": false
},
{
"id": 'SOLID',
"isFiltered": true
}
]
};
var filtered = multiFilter(products, filters);
console.log(filtered);