Есть ли способ объединить выбранные теги для отображения только элементов, соответствующих всем тегам? - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над простым приложением для отображения списка встреч, поиска и фильтрации в React.

Код настроен для фильтрации результатов (взятых из Google Sheet) с различными «тегами». Каждый дополнительный тег, однако, работает как объединение, а не пересечение, добавляя больше записей вместо того, чтобы сворачивать их вниз.

  //filter meetings based on selected tags
  if (tags.length) {
    meetings = meetings.filter(meeting => {
      for (let i = 0; i < tags.length; i++) {
        if (meeting.tags.includes(tags[i])) return true;
        console.log(tags[i])
      }
      return false;
    });
  }

Я искал какой-нибудь способ поменять функцию «включенные» на что-то, что требует, чтобы все выбранные теги присутствовали в записи для отображения.

Полный текст код можно посмотреть здесь: https://github.com/abhinemani/oiaa

Ответы [ 3 ]

0 голосов
/ 09 апреля 2020

Отрицание условия и замена возвращаемых значений будут делать

  if (tags.length) {
    meetings = meetings.filter(meeting => {
      for (let i = 0; i < tags.length; i++) {
        if (!meeting.tags.includes(tags[i])) return false;
      }
      return true;
    });
  }

таким образом, это исключит все встречи, которые не содержат один из тегов

0 голосов
/ 09 апреля 2020

Array.prototype.every () проверяет, все ли элементы массива передают предикат.

Обратите внимание, что Array.prototype.every() возвращает true для пустых массивов, поэтому вы можете захотеть чтобы добавить чек для длины тегов собрания:

var tags = [1,2,3];
var meetings = [{ id: 0, tags: [1,2]}, {id: 1, tags: [1,2,3]}, {id: 2, tags:[1]}, {id: 3, tags: []}, {id: 4, tags: [1,2,3] }];

meetings = meetings.filter(meeting =>
	!tags.length || tags.every((tag) =>
  	     meeting.tags && meeting.tags.length && meeting.tags.includes(tag)
        )
);

console.log(meetings);
0 голосов
/ 09 апреля 2020
cosnt entryTagsArray = [...];

const selectedTagsArray = [...];

const isAllAvailable =  entryTagsArray.every(selectedTagsArray)

не уверен, что вам нужно, но этот код проверит наличие всех тегов внутри массива в другом и затем вернет true или false в зависимости от ситуации, я надеюсь, что это работает

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