Фильтровать массив объектов на основе свойства массива, содержащего все значения из другого массива - PullRequest
0 голосов
/ 31 января 2019

У меня есть массив объектов:

const breeds=[{name: 'Golden', temperament: ['friendly', 'kind', 'smart']},{name: 'Husky', temperament: ['alert', 'loyal', 'gentle']},{name: 'Yorkshire Terrier', temperament: ['bold', 'independent', 'kind']}]

Я бы хотел отсортировать их по выбранному «темпераменту».Допустим, пользователь выбрал «добрый» и «дружественный», он должен возвращать только «Золотой».

Я использую JavaScript и подчеркивание, и это то, что я пробовал до сих пор:

 //selected is an array of selected temperaments
 //breeds is the array of objects
function filterTemperaments(selected, breeds) {
  return _.filter(breeds, function (breed) {
    if (!breed.temperament) breed.temperament = "";
    const breedList = breed.temperament;
    return breedList.includes(...selected);
  }, selected);
}

Похоже, что возвращаются только те породы, которые соответствуют первому темпераменту в выбранном массиве.Например, если выбрано ['kind', 'loyal'], а порода - {name:'Golden', temperament: ['kind', 'smelly']}, Голден все равно вернется как истинный, несмотря на несоответствие «лояльному» темпераменту

Есть какие-нибудь мысли по поводу лучшего решения здесь?Заранее спасибо!!

Ответы [ 2 ]

0 голосов
/ 31 января 2019

легко использовать, используя filter и every, чтобы узнать, есть ли у вас совпадения, и вернуть соответствующие значения.

const breeds = [{
  name: 'Golden',
  temperament: ['friendly', 'kind', 'smart']
}, {
  name: 'Husky',
  temperament: ['alert', 'loyal', 'gentle']
}, {
  name: 'Yorkshire Terrier',
  temperament: ['bold', 'independent', 'kind']
}]

//selected is an array of selected temperaments
//breeds is the array of objects
function filterTemperaments(selected, breeds) {
  return breeds.filter(({ temperament }) => { //here I'm desctructuring the object only to get the temperaments.
    return selected.every(selection => temperament.indexOf(selection) !== -1)
  })

}

const result = filterTemperaments(['kind', 'friendly'], breeds);
console.log(result)
0 голосов
/ 31 января 2019

Вы можете использовать filter для возврата только тех пород, у которых выбран every темперамент

const breeds=[{name: 'Golden', temperament: ['friendly', 'kind', 'smart']},{name: 'Husky', temperament: ['alert', 'loyal', 'gentle']},{name: 'Yorkshire Terrier', temperament: ['bold', 'independent', 'kind']}],
    selected = ['kind', 'friendly']

const filtered = breeds.filter(b => selected.every(s => b.temperament.includes(s)))

console.log(filtered)
...