Угловой - динамически управлять состоянием фильтра - PullRequest
0 голосов
/ 27 мая 2019

У меня есть 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. ruleFilters могут быть пустыми
  2. Фильтры серьезности могут быть пустыми.
  3. Определен один или несколько фильтров серьезности, но фильтры правила не существуют, и наоборот.

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

1 Ответ

1 голос
/ 27 мая 2019

Вы можете проверить length массивов filter , прежде чем проверять, содержат ли они значения свойств.Если 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.log(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...