Angular - динамически управлять условием фильтра

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

    var severityFilters = ["High", "Medium", "Low"]

 var ruleFilters = ["true", "false"] 

var allResults = [

{
    "name": "Test1",
    "severity": "High",
    "clean": true
},

{
    "name": "Test2",
    "severity": "Low",
    "clean": false
},

{
    "name": "Test3",
    "severity": "Medium",
    "clean": false
},

{
    "name": "Test4",
    "severity": "High",
    "clean": true
}

]

Массив severityFilters и ruleFilters создаются динамически, когда пользователь устанавливает и снимает флажки некоторых фильтров. Поэтому, если флажки severityFilters не отмечены, этот массив будет пустым. Если отмечен только High, то в severityFilters будет High. То же самое с флажками ruleFilters.

Я хотел бы написать функцию для возврата некоторых отфильтрованных результатов на основе значений в severityFilters и ruleFilters. Функция filterResults вызывается при проверке каждого флажка фильтра.

var filteredResults = []

    filterResults (severityFilters, ruleFilters, allResults)
    {
       for (let i = 0; i < allResults.length; i++) {
            if (severityFilters.length > 0 && ruleFilters.length > 0)
            {
              if (ruleFilters.includes(this.allResults[i].clean.toString()) && 
severityFilters.includes(allResults[i].severity)
              )
              {
                this.filteredResults = [...this.filteredResults, ...allResults[i]];
              }
            }
    }
    } 

Эта функция работает, если указаны как severityFilters, так и ruleFilters.

Как я могу покрыть проверку фильтрации для следующих сценариев:

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

Есть ли способ настроить функцию без написания длинных условий if, чтобы результаты отфильтровывались независимо от длины массива severityFilters и ruleFilters.

Поведение ключевого слова "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
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете проверить length массивов фильтр, прежде чем проверять, включают ли они значения свойств. Если severityFilters пусто, !severityFilters.length вернет true. Таким образом, он не будет проверять второе условие includes из-за ||. Если severityFilters действительно имеет какое-то значение, то severityFilters.includes(o.severity) будет проверено, и только те объекты со значением severity в severityFilters будут отфильтрованы.

const severityFilters = ["High"]
const ruleFilters = ["true", "false"]
var allResults=[{name:"Test1",severity:"High",clean:true},{name:"Test2",severity:"Low",clean:false},{name:"Test3",severity:"Medium",clean:false},{name:"Test4",severity:"High",clean:true}];

const output = allResults.filter(o =>
  (!severityFilters.length || severityFilters.includes(o.severity)) &&
  (!ruleFilters.length || ruleFilters.includes(o.clean.toString()))
)

console.info(output)

хм .. Я не могу изменить массив allResults, как вы его определили.

Jake 27.05.2019 18:46

@ Джейк, я не изменил allResults здесь

adiga 27.05.2019 18:47

У вас есть clean:!0. Это должно быть только false или true.

Jake 27.05.2019 18:48

@Джейк, о, прости. Я использовал минификатор, чтобы получить массив в одну строку. Он преобразовал false в !0 по какой-то странной причине

adiga 27.05.2019 18:49

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