Это то, что вы можете сделать, чтобы создать мультифильтр без множества операторов if.
Шаг первый:
Создайте объект, который выполняет различные функции сравнения:
let compareFunctions = {
equal: function(a,b) {
return a === b;
},
in: function(a,b){
return a.indexOf(b) !== -1
}
}
Шаг второй:
Создайте функцию, имеющую следующие параметры:
- ключ - ключ поля вашей записи, который вы хотите отфильтровать.
- значение - значение, которое вы хотите отфильтровать по
- compareFn - функция сравнения, которая будет использоваться для этого поля
Эта функция возвращает функцию, которая выполняет условие.
function condition(key, value, comparFn = compareFunctions.equal) {
return function(data) {
return comparFn(data[key],value);
}
}
Шаг третий:
Создайте массив с функциями «condition», представляющими значения вашего фильтра:
let filterArray = [
condition('category', 'sports'),
condition('title', 'goal', compareFunctions.in),
condition('author', 'john'),
condition('tags', 'hokey', compareFunctions.in),
]
Шаг четвертый:
Отфильтруйте свою запись, вызвав массив функций условий для каждой записи и оценив результат каждого условия:
let result = dataset.filter(y => {
let resolved = filterArray.map(x => x(y))
return resolved.every(x => x === true);
})
Полный пример кода:
let compareFunctions = {
equal: function(a,b) {
return a === b;
},
in: function(a,b){
return a.indexOf(b) !== -1
}
}
function condition(key, value, comparFn = compareFunctions.equal) {
return function(data) {
return comparFn(data[key],value);
}
}
let dataset = [
{
category: "sports",
title: "goal goal goal",
author: "john",
tags: ["hokey", "ice-hokey"]
},
{
category: "news",
title: "bla bla",
author: "Timo",
tags: ["news"]
},
{
category: "news",
title: "blub blub",
author: "alex",
tags: ["hokey", "ice-hokey"]
},
{
category: "sports",
title: "Kölner Haie bla bla",
author: "Timo",
tags: ["hokey", "ice-hokey"]
}
]
let filterArray = [
condition('category', 'sports'),
condition('title', 'goal', compareFunctions.in),
condition('author', 'john'),
condition('tags', 'hokey', compareFunctions.in),
]
//console.log(filterArray)
let result = dataset.filter(y => {
let resolved = filterArray.map(x => x(y))
return resolved.every(x => x === true);
})
console.log(result)