JavaScript 中的动态 if 条件

Dynamic if conditions in JavaScript

是否可以在不使用影响其性能的 eval() 或 new function() 的情况下动态传递 if 语句的条件及其运算符。

<script>

var Students =  [{
            "name": "Raj",
             "Age":"15",
            "RollNumber": "123",
            "Marks": "99",
              
        }, {
            "name": "Aman",
             "Age":"14",
            "RollNumber": "223",
            "Marks": "69",
           },
           {
            "name": "Vivek",
             "Age":"13",
            "RollNumber": "253",
            "Marks": "89",
           }
        ];



*Number of condition are dynamic. can even contain 3 or 4 condition at a time*

var condition = [{"attribute":"el.Age","operator":">=","value":14},
                 {"attribute":"el.Marks","operator":"<=","value":70}];

var newArray =Students.filter(function (el)
{
  if( condition[0].attribute condition[0].operator condition[0].value && condition[1].attribute condition[1].operator condition[1].value ){
  
return true;
  
});

console.log(newArray);
</script>

是的,您将操作数和运算符传递给一个函数,该函数根据运算符分派给执行操作的对象。

作为代码草图:

const operators = new Map([
    ["<", lt],
    [">", gt],
    ["<=", lte],
    [">=", gte],
    // ...
]);
function evaluate(operator, leftOperand, rightOperand) {
    const evaluator = operators.get(operator);
    if (!evaluator) {
        throw new Error(`Unknown operator ${operator}`);
    }
    return evaluator(leftOperand, rightOperand);
}

...其中ltgt等是执行操作的函数。我在上面使用了 operatorleftOperandrightOperand,但如果您愿意,可以使用 attributevalue。您需要 like this 来获取“属性”的值(JavaScript 项是“属性”)。

(或者你可以在 evaluate 函数本身的大 switch 中进行操作。)

然后你在 filter:

中使用那个函数
let newArray = Students.filter(student => conditions.every(({operator, attribute, value}) => {
    const leftOperand = getProperty(student, attribute);
    return evaluate(operator, leftOperand, value);
}));

我在那里使用了 every,因为您使用的是 && 条件。 (请注意,我将 condition 数组重命名为 conditions,因为数组包含多个值。)