Вы можете решить эту проблему также с помощью Object.entries и Array.filter и Array.some , например:
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 },
];
let filter1 = { color: 'Blue', size: '70' }
let filter2 = { name: '', color: 'Blue', size: '60' }
let filter3 = { name: '', color: '', size: '' }
let nestedFilter = (arr, filter) => {
let fE = Object.entries(filter)
return arr.filter(f => fE.some(([k,v]) => !v || f[k].toString().includes(v)))
}
console.log(nestedFilter(products, filter1)) // 3 objects
console.log(nestedFilter(products, filter2)) // 4 objects
console.log(nestedFilter(products, filter3)) // 4 objects
Идея состоит в том, чтобы получить entries
фильтра, с которым вы работаете, а затем использовать его ключ / значение, чтобы проверить, если сначала нет значения, равного true
для нас (нам нужны записи, ключ фильтра которых совпадает с пустой строкой) и если фактическое значение соответствует значению текущего ключа отфильтрованного объекта.