Reputation: 987
I have a requirement very similar to How to filter array by array of dynamic objects? however I need to filter on all values in my filter object. Please see my test below
let cardsArray = [
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"tyty","year":"2011"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"jinky32","year":"2011"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"dfgdf","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"gdgg","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"}
]
//const filters = {userName:"tyty",status:"Own",year:"2011",series:"Contenders"}
//const filters = {series:"Contenders",year:"2011"};
const filters = {series:"Contenders"};
let final = cardsArray.filter(value => {
return Object.entries(value).some(([key, value]) => {
return typeof value == 'string' && value.includes(filters[key])
})
})
console.log(final)
If my filter object contains one pair e.g. const filters = {series:"Contenders"};
then it works. However I need to filter based on more than one pair e.g. const filters = {series:"Contenders",year:"2011"};
(and ultimately more), however when I do this the second pair is not taken into account.
Can anyone advise on the correct way to do this?
Upvotes: 1
Views: 61
Reputation: 337
Try the following:
let final = cardsArray.filter(obj => {
return ! Object
.keys(filters)
.map(key => obj[key] === filters[key])
.includes(false)
})
Upvotes: 0
Reputation: 28414
The condition should be that all filters
's key-value
pairs are satisfied in a card
element:
let cardsArray = [
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"tyty","year":"2011"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"jinky32","year":"2011"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"dfgdf","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Contenders","status":"Own","userName":"gdgg","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"},
{"brand":"National Treasures","manufacturer":"Panini","series":"Century Materials","status":"Own","userName":"tyty","year":"2010"}
]
const filters = {series:"Contenders",year:"2011"};
let final = cardsArray.filter(card =>
Object.entries(filters).every(([key, value]) => card[key]===value)
);
console.log(final)
Upvotes: 3