0

In the below code, I am trying to reduce the persons array only to persons which match perfectly with filters object.

Currently the output is an array of objects that have a match in ANY of the object keys. How can I adjust it to return only the second person - the one that has a perfect match with ALL filters?

var persons = [
	{city: 'London', 'age': 18, 'name': 'Josh'},
	{city: 'London', 'age':42, 'name': 'Josh'},
	{city: 'New York', 'age': 42, 'name': 'Mike'},
	{city: 'Tokyo', 'age': 33, 'name': 'Kazuna'},
]

var filters = {
	city: 'London',
	age: 42,
	name: 'Josh',
}

function filter(person){
	for (let key of Object.keys(filters)) {
		if (person[key] == filters[key]) {
			return person
		}
	}
}

var filtered = persons.filter((person) => filter(person))
console.log(filtered)

1
  • You want to use every() Commented Feb 21, 2019 at 14:51

5 Answers 5

5

You should use the function every to accomplish that.

var persons = [{     city: 'London',     'age': 18,     'name': 'Josh'   },   {     city: 'London',     'age': 42,     'name': 'Josh'   },   {     city: 'New York',     'age': 42,     'name': 'Mike'   },   {     city: 'Tokyo',     'age': 33,     'name': 'Kazuna'   }, ],
    filters = {city: 'London',age: 42,name: 'Josh'};

function myOwnFilter(person) {
  return Object.keys(filters).every(key => filters[key] === person[key]);
}

var filtered = persons.filter(myOwnFilter);
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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

Comments

1

use every() to make sure everything matches

var persons = [
	{city: 'London', 'age': 18, 'name': 'Josh'},
	{city: 'London', 'age':42, 'name': 'Josh'},
	{city: 'New York', 'age': 42, 'name': 'Mike'},
	{city: 'Tokyo', 'age': 33, 'name': 'Kazuna'},
]

var filters = {
	city: 'London',
	age: 42,
	name: 'Josh',
}

const result = persons
  .filter(person => 
    Object.keys(filters)
      .every(key => 
        filters[key] === person[key]
      )
  )

console.log(result)

You can improve performance moving the Object.keys() out of the loop

Comments

1

You could take the entries of the filters object and check every person with every entry of it with Array#every, which returns true if every predicate is true.

var persons = [{ city: 'London', 'age': 18, 'name': 'Josh' }, { city: 'London', 'age':42, 'name': 'Josh' }, { city: 'New York', 'age': 42, 'name': 'Mike' }, { city: 'Tokyo', 'age': 33, 'name': 'Kazuna' }],
    filters = { city: 'London', age: 42, name: 'Josh' },
    filterEntries = Object.entries(filters),
    result = persons.filter(person => filterEntries.every(([k, v]) => person[k] === v));

console.log(result);

Comments

0

You can use && to create the condition in the filter

var persons = [{
    city: 'London',
    'age': 18,
    'name': 'Josh'
  },
  {
    city: 'London',
    'age': 42,
    'name': 'Josh'
  },
  {
    city: 'New York',
    'age': 42,
    'name': 'Mike'
  },
  {
    city: 'Tokyo',
    'age': 33,
    'name': 'Kazuna'
  },
]

var filters = {
  city: 'London',
  age: 42,
  name: 'Josh',
}


var filtered = persons.filter(function(person) {
  return person.city === filters.city && person.age === filters.age && person.name === filters.name

})
console.log(filtered)

Comments

0

Are you looking for something like this?

var persons = [
    {city: 'London', 'age': 18, 'name': 'Josh'},
    {city: 'London', 'age':42, 'name': 'Josh'},
    {city: 'New York', 'age': 42, 'name': 'Mike'},
    {city: 'Tokyo', 'age': 33, 'name': 'Kazuna'},
]

var filters = {
    city: 'London',
    age: 42,
    name: 'Josh',
}

function filter(person){
    for (let key of Object.keys(filters)) {
        if (person[key] !== filters[key]) {
            return false;
        }
    }
    return true;
}



var filtered = persons.filter((person) => filter(person))
console.log(filtered)

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.