1

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?

2 Answers 2

3

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)

Sign up to request clarification or add additional context in comments.

Comments

0

Try the following:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.