这是您可以在没有很多 if 语句的情况下创建多重过滤器的方法。
第一步:
创建一个执行各种比较功能的对象:
let compareFunctions = {
equal: function(a,b) {
return a === b;
},
in: function(a,b){
return a.indexOf(b) !== -1
}
}
第二步:
创建一个具有以下参数的函数:
- key - 要过滤的记录字段的键。
- value - 要过滤的值
- compareFn - 用于该字段的比较函数
这个函数返回一个执行条件的函数。
function condition(key, value, comparFn = compareFunctions.equal) {
return function(data) {
return comparFn(data[key],value);
}
}
第三步:
使用代表过滤器值的“条件”函数创建一个数组:
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)