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

如何使用JavaScript管理动态或独立的If语句?,javascript,node.js,Javascript,Node.js,我在JavaScript中有一个多维数组,我使用reduce方法过滤相同的数组&我有两个参数来过滤数组 2个过滤器参数为-位置,团队。所以我用下面的代码做了 var filterdProjectionsData = await ProjectionsData.reduce(function(filtered, Projection) { if (Position && Projection.Position === Position &

我在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个过滤器参数的问题,在这种情况下,if/else条件组合将不会增加&在大于2-3个过滤器参数的情况下,不可能维护所有if-else语句


那么,有没有其他方法可以非常轻松地管理这些情况?过滤器参数是可选的(不是强制性的),因此请让我了解解决方案?

这是一个非常简单的小框架,但您应该能够看到如何将其扩展到所需的复杂程度:在这里,您构建了一个“过滤器”数组,然后使用它来处理目标数组

现在这只适用于等价性,并且现在可以与(and)一起使用,但是不难改变它来处理基本的布尔逻辑(or)。关键是将“过滤器”数组构造为KVPs,即通过运算符查找与值进行比较的属性

这样,您就可以拥有任意多或任意少的过滤器参数,而无需编写一百万条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));

这是一个非常简单的小框架,但您应该能够看到如何将其扩展到所需的复杂程度:在这里,您构建了一个“过滤器”数组,然后使用它来处理目标数组

现在这只适用于等价性,并且现在可以与(and)一起使用,但是不难改变它来处理基本的布尔逻辑(or)。关键是将“过滤器”数组构造为KVPs,即通过运算符查找与值进行比较的属性

这样,您就可以拥有任意多或任意少的过滤器参数,而无需编写一百万条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));

我不认为Array.reduce()是异步的,那么为什么
等待
?好的,我将删除它。你能回答这个问题吗?在所有情况下,你都在做完全相同的事情,即
过滤。推(投影)
。所以你可以做的是,检查你不需要推它的情况。类似这样的内容:
如果(某些条件)不做任何其他过滤。push()
请先说明所有条件。我不认为Array.reduce()是异步的,那么为什么
等待
?好的,我将删除它。你能回答这个问题吗?在所有情况下,你都在做完全相同的事情,即
过滤。推(投影)
。所以你可以做的是,检查你不需要推它的情况。类似这样:
如果(某些条件)不做任何其他过滤。push()
请先说明所有条件。