Фильтр многомерного массива, который содержит определенное значение - PullRequest
3 голосов
/ 16 июня 2019

У меня есть массив ...

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

... который мне нужно отфильтровать и отсортировать по полу.Поэтому, если я ищу слово «женщина», мне нужен массив семей, в которых есть женщины.Независимо от того, есть ли мужчина в семье.Таким образом, в приведенном выше коде, если я буду искать женщину, вернется только одна семья.Но если бы я искал по мужчине, 2 семьи вернулись бы.

Моя попытка выглядит следующим образом:

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

Я правильно не возвращаю?

Ответы [ 3 ]

2 голосов
/ 16 июня 2019

Вы должны просто использовать filter и some примерно так:

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:

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; }
0 голосов
/ 16 июня 2019

Вы можете использовать forEach и some.forEach будет использоваться для перебора массива и использования some для определения, имеет ли какой-либо объект в kids требуемый пол.

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


let filteredData = function(arr, gender) {
  let filteredFamily = [];
  arr.forEach(function(elem) {
    let ifHasGender = elem.kids.some(function(item) {
      return item.gender === gender
    })
    if (ifHasGender) {
      filteredFamily.push(elem)
    }
  })

  return filteredFamily;
}

console.log(filteredData(families, 'female'))
0 голосов
/ 16 июня 2019

Ваш код в основном там, за исключением одной маленькой детали: ваш внутренний фильтр возвращает пустой массив внешнему фильтру, который всегда оценивается как true.Добавьте .length к внутреннему массиву, чтобы сделать пустые массивы falsey:

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';
filteredList = families.filter(function (family) {
  return family.kids.filter(function (kid) {
    return kid.gender.toLowerCase().indexOf(filter) !== -1;
  }).length
  //^^^^^^^
});

console.log(filteredList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...