I'm wondering what is the cleanest way, better way to filter an array of objects depending on a string keyword
. The search has to be made in any properties of the object.
When I type lea
I want to go trough all the objects and all their properties to return the objects that contain lea
When I type italy
I want to go trough all the objects and all their properties to return the objects that contain italy
.
I know there are lot of solutions but so far I just saw some for which you need to specify the property you want to match.
ES6
and lodash
are welcome !
const arrayOfObject = [{
name: 'Paul',
country: 'Canada',
}, {
name: 'Lea',
country: 'Italy',
}, {
name: 'John',
country: 'Italy',
}, ];
filterByValue(arrayOfObject, 'lea') // => [{name: 'Lea',country: 'Italy'}]
filterByValue(arrayOfObject, 'ita') // => [{name: 'Lea',country: 'Italy'}, {name: 'John',country: 'Italy'}]
Here's how I would do it using lodash:
One way would be to use
Array#filter
,String#toLowerCase
andString#indexOf
like below.This code checks all the nested values until it finds what it's looking for, then stops and returns true to the "array.filter" for the object it was searching inside(unless it can't find anything - returns false). When true is returned, the object is added to the array that the "array.filter" method returns.
Well when we already know that its not going to be a search on an object with methods, we can do the following for saving bit on time complexity :
You could filter it and search just for one occurence of the search string.
Methods used:
Array#filter
, just for filtering an array with conditions,Object.keys
for getting all property names of the object,Array#some
for iterating the keys and exit loop if found,String#toLowerCase
for getting comparable values,String#includes
for checking two string, if one contains the other.