У меня есть 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
.
Как я могу покрыть проверку фильтрации для следующих сценариев:
Есть ли способ настроить функцию без написания длинных условий if, чтобы результаты отфильтровывались независимо от длины массива severityFilters
и ruleFilters
.
Вы можете проверить 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
здесь
У вас есть clean:!0
. Это должно быть только false
или true
.
@Джейк, о, прости. Я использовал минификатор, чтобы получить массив в одну строку. Он преобразовал false в !0
по какой-то странной причине
хм .. Я не могу изменить массив allResults, как вы его определили.