Применение нескольких фильтров к одним и тем же данным javascript

У меня есть куча данных, которые я читаю из файла json.

Мне нужно реализовать некоторые фильтры, которые будут возвращать правильные данные в зависимости от того, какие фильтры проверены.

Я использую реакцию и сокращение, и - и данные исследования поступают либо из флажков, либо из раскрывающихся списков.

Как лучше всего фильтровать фильтры, чтобы они хорошо работали вместе?

На данный момент они работают индивидуально, но ломаются, когда вы используете их друг с другом.

Вот мой код:

function filterStudies(studyData){
  let searchTerm = studyData.searchTerm  === undefined  ? '' :  studyData.searchTerm;
  let studies = studyData.studies.filter((val)=> val.name.toUpperCase().includes(searchTerm.toUpperCase()));

  if (typeof(studyData.isLive) !== 'undefined'){
    studies = studyData.isLive ? studies.filter((val) => val.live === studyData.isLive) : studyData.studies;
  }
  if (typeof(studyData.isCompleted) !== 'undefined'){
    studies = studyData.isCompleted ? studies.filter((val) => val.completed === studyData.isCompleted) : studyData.studies;
  }
  if (typeof(studyData.media) !== 'undefined'){
    studies = studyData.media === 'All' ? studyData.studies : studies.filter((val) =>  val.media === studyData.media);
  }
  if (typeof(studyData.environment) !== 'undefined'){
    studies = studyData.media === 'All' ? studyData.studies : studies.filter((val) =>  val.environment === studyData.environment);
  }
  return studies;
}

вы хотите минимизировать свой код или что-то еще? Это было не совсем понятно из вашего вопроса

Ol'rawnder Saini 17.04.2018 13:09

Вы всегда переопределяете studies = ...

baao 17.04.2018 13:09

Мне просто нужно вернуть новый массив studyData, в котором применены все фильтры.

marcusps1 17.04.2018 13:14

в основном, как заставить фильтры работать вместе, а не по отдельности.

marcusps1 17.04.2018 13:17

Это зависит от того, хотите ли вы, чтобы ваши фильтры были ИЛИ или И. Если вы проверите isCompleted и media, хотите ли вы исследования с isCompleted AND media или isCompleted OR media? В настоящее время это И.

Jeremy Thille 17.04.2018 13:18

@JeremyThille Все исследования будут иметь набор свойств, связанных с ними, например, одним из средств исследования будет 'TV', а isCompleted может быть 'true'. Когда вы выбираете опцию tv и опцию isCompleted, мне нужно применить оба этих фильтра к данным. Так что, я думаю, мне нужно И?

marcusps1 17.04.2018 13:35

В этом случае нет причин, по которым предоставленный вами код не должен работать. Что значит it breaks? Это вылетает? Что происходит?

Jeremy Thille 17.04.2018 15:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
87
1

Ответы 1

Я не уверен, хорошо ли я вас понял.

Но в любом случае, на первый взгляд, я думаю, что ваш последний if должен быть:

if (typeof(studyData.environment) !== 'undefined'){
    studies = studyData.environment === 'All' ? studyData.studies : studies.filter((val) =>  val.environment === studyData.environment);
}

вместо:

if (typeof(studyData.environment) !== 'undefined'){
    studies = studyData.media === 'All' ? studyData.studies : studies.filter((val) =>  val.environment === studyData.environment);
}

Кстати, я бы предложил упростить ваш код, полагаясь на один фильтр, который решает, какие элементы следует сохранить, а какие - отбросить.

Просто в качестве примера (я Не понимаю, что именно делает вид, что выполняет ваш код, поэтому мой вряд ли это сделает), но я надеюсь, что это может служить примером:

function filterStudies(studyData){
    let searchTerm = studyData.searchTerm  === undefined  ? '' :  studyData.searchTerm;
    let studies = studyData.studies.filter(function(val) {
        if (val.name.toUpperCase().includes(searchTerm.toUpperCase())) return true;
        if (val.live === studyData.isLive) return true;
        if (val.completed === studyData.isCompleted) return true;
        if (studyData.media === 'All' || val.media === studyData.media) return true;
        if (studyData.environment === 'All' || val.environment === studyData.environment) return true;
        return false;
    });

    return studies;
}

NOTE: Obviously those "if"s could be combined in single one (they perform an "or"). I tried to provide an example as close as possible to your original code but, in fact, this way would be quite more readable anyway...

Хм, исследования - это массив, который мне нужно вернуть - в основном он возвращает отфильтрованные данные для таблицы

marcusps1 17.04.2018 13:53

Другие вопросы по теме