Stuart Brown
Stuart Brown

Reputation: 987

Dynamically Filtering an Array

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

Answers (2)

knicola
knicola

Reputation: 337

Try the following:

let final = cardsArray.filter(obj => {
    return ! Object
        .keys(filters)
        .map(key => obj[key] === filters[key])
        .includes(false)
})

Upvotes: 0

Majed Badawi
Majed Badawi

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

Related Questions