По сути, вы ищете Regular Expression
.вам нужно изменить
filterKeys.every(key => !!filters[key].indexOf(item[key]))
на
!filterKeys.some(key => RegExp(filters[key], 'i').test(item[key].toString()));
конечно, позаботьтесь, используя item[key].toString()
, потому что в зависимости от случаяможет привести к проблеме, в этом случае я использовал ее из-за цифр (размер ключа продуктов).
let products = [{
name: "A",
color: "Blue",
size: 50
},
{
name: "B",
color: "Blue",
size: 60
},
{
name: "C",
color: "Black",
size: 70
},
{
name: "D",
color: "Green",
size: 50
},
{
name: "D",
color: "bluePartial", //you are looking for blue, but blue is a substring of bluepartial, this will be filtered as well
size: 50
},
{
name: "D",
color: "violet",
size: 700 // same as above, 70 is a substring of 700
},
];
// the value of each key is an array with the values to filter
let filters = {
color: "Blue",
size: "70"
};
function multiFilter(array, filters) {
const filterKeys = Object.keys(filters);
return array.filter((item) => {
return !filterKeys.some(key => RegExp(filters[key], 'i').test(item[key].toString()));
});
}
var filtered = multiFilter(products, filters);
console.log(filtered)