фильтровать массив объектов по атрибуту массива с другим массивом - PullRequest
0 голосов
/ 05 марта 2019

Следующий код НЕ возвращает ожидаемые результаты массива с 1 элементом.Может кто-нибудь, пожалуйста, сообщите мне о правильном синтаксисе?

let things = [{
    Name: 'Bill',
    Tags: ['tall', 'dude']
  },
  {
    Name: 'Ted',
    Tags: ['short', 'dude']
  }
];

let selectedTags = ['short', 'chick'];

let filtered = things.filter((thing => thing.Tags.indexOf(selectedTags) >= 0));
console.log(filtered);

Ответы [ 5 ]

0 голосов
/ 05 марта 2019

Необходимо выполнить итерацию по каждому элементу things и проанализировать каждый элемент в его массиве атрибутов Tags:

let things = [{
    Name: 'Bill',
    Tags: ['tall', 'dude']
  },
  {
    Name: 'Ted',
    Tags: ['short', 'dude']
  }
];

let selectedTags = ['short', 'chick'];
let filtered = things.filter(el => {
  //Use reduce on to get a count of how many matching tags
  return el.Tags.reduce((accum, tag) => {
    if (selectedTags.indexOf(tag) > -1) {
      accum += 1;
    }
    return accum;
  }, 0);
});

console.log(filtered);
0 голосов
/ 05 марта 2019

Если вам нужно отфильтровать элементы, у которых есть tag, присутствующий в массиве selectedTags, то вы можете пойти с этим:

let things = [
  {Name: 'Bill', Tags: ['tall', 'dude']},
  {Name: 'Ted', Tags: ['short', 'dude']}
];

let selectedTags = ['short', 'chick'];

let filtered = things.filter(
    thing => selectedTags.some(x => thing.Tags.includes(x))
);
    
console.log(filtered);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Если вам нужно отфильтровать элементы, которые имеют все tags, присутствующие в массиве selectedTags, то вы можете использовать:

let things = [
  {Name: 'Bill', Tags: ['tall', 'dude']},
  {Name: 'Ted', Tags: ['short', 'dude']},
  {Name: 'Test', Tags: ['short', 'chick']}
];

let selectedTags = ['short', 'chick'];

let filtered = things.filter(
    thing => selectedTags.every(x => thing.Tags.includes(x))
);
    
console.log(filtered);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 05 марта 2019

selectedTags - это массив.

.indexOf() переводится для строки.

Вы можете получить строку в свой массив, выбрав ее с индексом, например:

thing.Tags.indexOf(selectedTags[0])
0 голосов
/ 05 марта 2019

Похоже, вы хотите отфильтровать things, основываясь на том, есть ли в selectedTags значение thing.Tags.

. Вы бы сделали что-то подобное

things.filter(thing => thing.Tags.some(tag => selectedTags.includes(tag)));

ЭтоЯ думаю, это самый выразительный способ написать это.Дайте мне все вещи, где некоторые вещи. Теги включены в массив selectedTags.

0 голосов
/ 05 марта 2019

Вы передаете массив selectedTags в includes.Вам необходимо проверить цикл по selectedTags и проверить, присутствует ли тег в .Tags объекта.

let things = [{Name: 'Bill', Tags: ['tall','dude']},
              {Name: 'Ted', Tags: ['short','dude']}];
console.log(things);

let selectedTags = ['short','chick'];

let filtered = things.filter(x => {
  for(let tag of selectedTags){
    if(x.Tags.includes(tag)) return true;
  }
  return false;
});
console.log(filtered);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...