Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

filter array by prop string with multiple matches

I am trying to filter an array of users, which has a property called name, that when trying to filter by the string the order is fine.

const users = [
  { name: 'bob simmons', age: 25 },
  { name: 'samantha simpsoms', age: 19 },
  { name: 'karl bone romero', age: 33 },
  { name: 'bob bone cruz', age: 33 }
]

const getUsers = (prop) => users.filter(({name}) => name.match(prop))

getUsers('bob')
// [{ name: 'bob simmons', age: 25 }, { name: 'bob bone cruz', age: 33 }]

getUsers('bob bone')
// [{ name: 'bob bone cruz', age: 33 }]

Well perfect, it is working, the problem I currently have is when I try to bring the name as it is not in the name property. Now what I'm trying to do is look for parts of the string but not in the order that is declared for example ...

search: bob cruz result {name: 'bob bone cruz', age: 33}
search: karl romero result { name: 'karl bone romero', age: 33 }

try to split the search parameter and then inside the filter ask with some if they exist include the text inside the name, the problem with this is that it returns all the search matches.

const getUsers = (prop) => users.filter(({ name }) => {
   return prop.split(' ').some(e => name.includes(e))
 })

getUsers('bob cruz')
// [{ name: 'bob simmons', age: 25 }, { name: 'bone bob cruz', age: 33 }]

I just need you to return [{ name: 'bone bob cruz', age: 33 }]

like image 542
Gabriela Avatar asked Sep 02 '26 08:09

Gabriela


2 Answers

Just use Array#every instead. The method names should make the distinction self-explanatory.

The every() method tests whether all elements in the array pass the test implemented by the provided function. It returns a Boolean value.

const users = [
  { name: 'bob simmons', age: 25 },
  { name: 'samantha simpsoms', age: 19 },
  { name: 'karl bone romero', age: 33 },
  { name: 'bob bone cruz', age: 33 }
]

const getUsers = (prop) => users.filter(({ name }) => {
   return prop.split(' ').every(e => name.includes(e))
 })

console.log(getUsers('bob cruz'))
like image 66
Unmitigated Avatar answered Sep 04 '26 23:09

Unmitigated


Use every instead of some

const users = [
  { name: 'bob simmons', age: 25 },
  { name: 'samantha simpsoms', age: 19 },
  { name: 'karl bone romero', age: 33 },
  { name: 'bob bone cruz', age: 33 }
];

const getUsers = (prop) => users.filter(({ name }) => {
   return prop.split(' ').every(e => name.includes(e))
 });
 
 console.log(getUsers('bob cruz'));
like image 22
Rahul Singh Avatar answered Sep 04 '26 23:09

Rahul Singh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!