I want to filter objects based on a set of arrays containing filter terms. It basically works until one of the filter arrays contains multiple terms. Here is the code:
// the filters
const filters = {
"eyeColor": ["blue"],
"gender": ["male"],
"age": ["33"],
"tags": ["d3js", "vuejs"] // multiple terms in the filter array breaks the code (returns empty array)
}
// the data
const users = [
{
"age": "33",
"eyeColor": "blue",
"tags": "d3js, max, grotesk",
"gender": "male",
},
{
"age": "31",
"eyeColor": "blue",
"tags": "vuejs, adrian, serif",
"gender": "male",
},
{
"age": "37",
"eyeColor": "brown",
"tags": "vuejs, max, mono, d3js",
"gender": "female",
},
{
"age": "33",
"eyeColor": "blue",
"tags": "vuejs, markus, grotesk",
"gender": "male",
},
]
// the filter function
let results = users.filter(function (object) {
return Object.entries(filters).every(function ([key, value]) {
return value.every(function (filter) {
return object[key].includes(filter)
})
})
});
console.log(results);
I get an empty array, while the expected result would be:
{
"age": "33",
"eyeColor": "blue",
"tags": "d3js, max, grotesk",
"gender": "male",
},
{
"age": "33",
"eyeColor": "blue",
"tags": "vuejs, markus, grotesk",
"gender": "male",
}
How can I get the expected result?
usersso thattagswill also be an array of "tags" instead of a string?serifwould also matchsans-serif