JS фильтрация массива объектов через объект фильтрации

Есть массив данных:

let data = {
  Brand:"Prada",
  Category:"Jacket",
  Color:['Black', 'Red'],
  Name:"Black Jacket",
  Size:"20",
  Type:"Outerwear"
},
{
  Brand:"Prada",
  Category:"T-Shirt",
  Color:['White'],
  Name:"White T-Shirt",
  Size:"18",
  Type:"Outerwear"
},
{
  Brand:"Gucci",
  Category:"Glasses",
  Color:['White'],
  Name:"White Glasses",
  Type:"Accessory"
},
{
  Brand:"Dior",
  Category:"Glasses",
  Color:['Black'],
  Name:"Black Glasses",
  Type:"Accessory"
}

И так же есть объект, содержащий поля для сравнения:

var selected = {
  Brand:[],
  Category:[],
  Color:[],
  Size:[],
  Type:[]
}

Как сделать фильтрацию по ключам так, что если в объекте фильтрации было несколько значений, они тоже учитывались в фильтре? Так, например, при таком объекте сравнения:

{
  Brand:[],
  Category:[],
  Color:['Black'],
  Size:[],
  Type:['Accessory', 'Outerwear']
}

Должны будут выведены только 1-й и 4-й элемент, но при

{
  Brand:[],
  Category:[],
  Color:['White', 'Black'],
  Size:[],
  Type:['Outerwear']
}

только 1-й и 2-й...


Ответы (2 шт):

Автор решения: Dmitry Kozlov

В фильтре пройтись по ключам элемента фильтра, после сравнить значение с элементом массива по такому же ключу

let data = [{
  Brand:"Prada",
  Category:"Jacket",
  Color:['Black', 'Red'],
  Name:"Black Jacket",
  Size:"20",
  Type:"Outerwear"
},
{
  Brand:"Prada",
  Category:"T-Shirt",
  Color:['White'],
  Name:"White T-Shirt",
  Size:"18",
  Type:"Outerwear"
},
{
  Brand:"Gucci",
  Category:"Glasses",
  Color:['White'],
  Name:"White Glasses",
  Type:"Accessory"
},
{
  Brand:"Dior",
  Category:"Glasses",
  Color:['Black'],
  Name:"Black Glasses",
  Type:"Accessory"
}];

let selected = {
  Brand:[],
  Category:[],
  Color:['White', 'Black'],
  Size:[],
  Type:['Outerwear']
};

let result = data.filter((entry) => {
  let satisfied = false;
  Object.keys(entry).forEach((dataKey) => {
    if (selected[dataKey] && selected[dataKey].includes(entry[dataKey])) {
      satisfied = true;
    }
  });
  
  return satisfied;
});

console.log(result);

→ Ссылка
Автор решения: Miha

const data = [{
  Brand: "Prada",
  Category: "Jacket",
  Color: ['Black', 'Red'],
  Name: "Black Jacket",
  Size: "20",
  Type: "Outerwear"
}, {
  Brand: "Prada",
  Category: "T-Shirt",
  Color: ['White'],
  Name: "White T-Shirt",
  Size: "18",
  Type: "Outerwear"
}, {
  Brand: "Gucci",
  Category: "Glasses",
  Color: ['White'],
  Name: "White Glasses",
  Type: "Accessory"
}, {
  Brand: "Dior",
  Category: "Glasses",
  Color: ['Black'],
  Name: "Black Glasses",
  Type: "Accessory"
}];

const filter = {
  Brand: [],
  Category: [],
  Color: ['White', 'Black'],
  Size: [],
  Type: ['Outerwear']
}

let result = [];

for (let element of data) {
  for (let key in element) {
    let value = element[key];
    if (typeof value === 'object') {
      value = value[0];
    }
    let filterValue = filter[key];

    if (filterValue && filterValue.includes(value)) {
      result.push(element);
      break;
    }
  }
}

console.log(result);

→ Ссылка