如何使用JavaScript管理动态或独立If语句



我在JavaScript中有一个多维数组,我使用reduce方法&我有两个参数来过滤数组。

2个过滤器参数是-位置,团队。所以我用下面的代码完成了。

var filterdProjectionsData = await ProjectionsData.reduce(function(filtered, Projection) {
if (Position && Projection.Position === Position && !Team) {
filtered.push(Projection);
}else if (Team && Projection.Team === Team && !Position) {
filtered.push(Projection);
}else if ((Position && Projection.Position === Position) && (Team && Projection.Team === Team)) {
filtered.push(Projection);
}
return filtered;
}, []);

我可以用1-2个过滤器参数轻松管理,但我对3-4-5个过滤器参数有问题,在这种情况下,如果/其他条件的组合不会增加&在大于2-3个滤波器参数的情况下,不可能维护all-if-else语句。

那么,有没有其他方法可以非常简单地管理这些情况?过滤器参数是可选的(不是强制性的(,所以请让我知道解决方案

这是一个非常简单的小框架,但您应该能够了解如何将其扩展到所需的复杂性级别:在这里,您构建一个"filter"数组,然后使用它来处理目标数组。

现在,这只适用于等价性,并且现在与(和(一起工作,但不难改变它来处理基本的布尔逻辑(或(。关键是将"过滤器"数组构造为KVP,即通过运算符查找与值进行比较的属性。

通过这种方式,您可以拥有任意多或任意少的过滤器参数,而无需编写一百万if-else-if语句!

编辑:添加运算符值以增加灵活性。

let myArray = [
{ID : 1, position : "tinker", salary : 40000},
{ID : 2, position : "tinker", salary : 45000},
{ID : 3, position : "tailor", salary : 30000},
{ID : 4, position : "soldier", salary : 50000},
{ID : 5, position : "spy", salary : 140000},
]
let filters = [
{attribute: "position", value: "tinker", operator : "=="},
{attribute: "salary", value: 41000, operator: ">"}  
]
function multiFilter(filters, array){
filters.forEach(myFilter => {
array = array.filter(arrayItem => eval("arrayItem." + myFilter.attribute + myFilter.operator + "'" + myFilter.value + "'"));
});
return array;
}
console.log(multiFilter(filters, myArray));

最新更新