javascript - ¿Cómo filtrar múltiples veces un arreglo de objetos?
Este es mi código de demostración:
//Imports and decorators up here for Angular 2
export class ProductsListComponent {
products = [
{ name: "A", color: "Blue", size: 50 },
{ name: "B", color: "Blue", size: 60 },
{ name: "C", color: "Black", size: 70 }
];
filters = {
colors: ["Blue", "Black"],
sizes: [70, 50]
};
//This is my first approach but just works for the colors array inside filters object
//and i have no ideia how to filter sizes too
filterProducts() {
let results = [];
this.filters.colors.forEach((color) => {
this.products.filter((product) => {
if (product.color === color) {
results.push(product);
}
return true; //filter callback requires a boolean
})
});
console.log(results);
}
}
Me gustaría que el array results se viera así según filters:
var results = [
{ "name": "A", "color": "Blue", "size": 50 },
{ "name": "C", "color": "Black", "size": 70 }
];
Espero haber explicado bien mi problema.
Respuesta #1
aquí hay un ejemplo usando los métodos de arreglo every y some:
var products=[
{"name":"A","color":"Blue","size":50},
{"name":"B","color":"Blue","size":60},
{"name":"C","color":"Black","size":70}
];
var filters={
color:["Blue","Black"],
size:[70,50]
};
var r = products.filter(x =>
Object.keys(filters).every(f =>
filters[f].some( z => z == x[f] )))
console.log(r)Respuesta #2
Podrías reescribir la función de la siguiente manera
filterProducts(){
let results=[], filersCopy = angular.copy(this.filters.colors);
this.products.filter((product)=>{
//checking in filters.colors collection using indexOf
let index = filersCopy.indexOf(product.color);
if(index > -1){
//removing matched element from copy, to ensure single occurence
filersCopy.splice(index, 1);
results.push(product);
return true;
}
});
console.log(results); //Printing filtered results
}
