我目前正在编写一个 JS 规则引擎,它有时需要使用 eval() 函数来评估布尔表达式。
首先,我构造一个等式:
var equation = "relation.relatedTrigger.previousValue" + " " + relation.operator +
" " + "relation.value";
relationship.relatedTrigger.previousValue是我要比较的值。
relationship.operator是运算符(“==”、“!=”、<=、“<”、“>”、>=")。
relationship.value是我要比较的值。
然后我简单地将这个字符串传递给 eval 函数,它返回 true 或 false ,如下所示:
return eval(equation);
这绝对可以正常工作(使用单词和数字)或除 >= 和 <= 之外的所有运算符。例如,当评估方程时:
relation.relatedTrigger.previousValue <= 100
当 previousValue = 0,1,10,100 和所有负数时返回 true,但对于介于两者之间的所有内容返回 false。
我将非常感谢任何人帮助我回答我的问题或帮助我找到替代解决方案。
问候,
奥吉尔。
PS 我不需要关于 eval() 函数的不安全性的演讲。任何赋予relation.relatedTrigger.previousValue 的值都是预定义的。
编辑:这是完整的功能:
function evaluateRelation(relation)
{
console.log("Evaluating relation")
var currentValue;
//if multiple values
if(relation.value.indexOf(";") != -1)
{
var values = relation.value.split(";");
for (x in values)
{
var equation = "relation.relatedTrigger.previousValue" + " " + relation.operator +
" " + "values[x]";
currentValue = eval(equation);
if (currentValue)
return true;
}
return false;
}
//if single value
else
{
//Evaluate the relation and get boolean
var equation = "relation.relatedTrigger.previousValue" + " " + relation.operator +
" " + "relation.value";
console.log("relation.relatedTrigger.previousValue " + relation.relatedTrigger.previousValue);
console.log(equation);
return eval(equation);
}
}
答案:由下面的 KennyTM 提供。字符串比较不起作用。需要转换为数字。