Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filter multidimensional array that contains a certain value

I have an array...

var families = [
  {
    family:"Jones",
    kids: [
      {name:"Kelly", gender:'female'},
      {name:"Mike", gender:'male'},
      {name:"Bill", gender:'male'}
    ]
  },{
    family:"Smiths",
    kids: [
      {name:"Roger", gender:'male'}
    ]
  }
]

...that I need filter through and sort out familys by gender. So if I search for 'female' I want an array of families that contain females in their family. Regardless if there is a male in the family. So in the above code, if I search for female, only one family would return. But if I searched by male, 2 families would return.

My try looks like this:

var filter = 'female';
filteredList = families.filter(function (family) {
  return family.kids.filter(function (kid) {
    return kid.gender.toLowerCase().indexOf(filter) !== -1;
  })
})

Am I not returning it properly?

like image 638
user3612986 Avatar asked Sep 15 '26 22:09

user3612986


1 Answers

You should just use filter and some like so:

var families=[{family:"Jones",kids:[{name:"Kelly",gender:'female'},{name:"Mike",gender:'male'},{name:"Bill",gender:'male'}]},{family:"Smiths",kids:[{name:"Roger",gender:'male'}]}];
var filter = "female";
const res = families.filter(({ kids }) => kids.some(({ gender }) => gender == filter));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

ES5 syntax:

var families=[{family:"Jones",kids:[{name:"Kelly",gender:'female'},{name:"Mike",gender:'male'},{name:"Bill",gender:'male'}]},{family:"Smiths",kids:[{name:"Roger",gender:'male'}]}];
var filter = "female";
var res = families.filter(function(family) {
  return family.kids.some(function(kid) {
    return kid.gender == filter;
  })
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
like image 75
Jack Bashford Avatar answered Sep 18 '26 11:09

Jack Bashford



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!