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);