我需要检查用户是否通过了公式,并使用了对象内部定义的一组受限的属性/值。对象属性是:
var klarf = {
InspectedDiceCount: 0,
FailedDiceCount: 0,
PassedDiceCount: 0,
UnclassifiedDiceCount: 0,
InspectedDefectCount: 0,
FailedDefectCount: 0,
PassedDefectCount: 0,
UnclassifiedDefectCount: 0
}
用户必须键入任何返回布尔值的数学表达式,才能将公式al“有效”:]
validate = eval(10 + klarf.PassedDiceCount > 100); //returns false (but valid formula)
validate = eval(klarf.InspectedDiceCount > klarf.FailedDiceCount + 1); //return true (but valid formula)
如果用户指定未定义的属性或未定义/不允许的变量,我怎么能抓住错误?
validate = eval(10 + klarf.dummy > 0); //returns true (but expected invalid formula)
validate = eval(a > b);
如果不通过eval,是否有任何js库可以执行公式评估?
目标是检索以input text
形式键入的用户公式,然后检测是否:a)公式有效(无论结果为真还是假),因为它仅使用允许的变量。有效公式例如:
(klarf.InspectedDiceCount > 10)
(1 > 2)
((klarf.UnclassifiedDefectCount * 100 / klarf.InspectedDefectCount) > 0.1)
b)公式无效,因为其中包含未声明的变量或klarf对象属性。无效的公式例如:
klarf.PropertyThatDoesNotExists > 0
dummy_variable > 1
clarf.FailedDiceCount < 16
这是我正在处理的js validate
公式:
function validate () {
expr = "result = " + $('#rule_formula').val();
r = eval(expr);
console.log(expr, r, result);
try {
r = eval("result = " + $('#rule_formula').val());
} catch(err) {
$('#rule_validation').html("Invalid rule. Error (" + err.message + ") detected").css({
'font-weight': 'bold',
'color': 'red'
});
}
if (typeof result == "boolean") {
$('#rule_validation').html("Rule is valid").css({
'font-weight': 'bold',
'color': 'green'
});
} else {
$('#rule_validation').html("Invalid rule. Boolean (true/false) output expected").css({
'font-weight': 'bold',
'color': 'red'
});
}
}
if( obj.z ){
validate = eval(10 + obj.z > 0); //returns true (but expected invalid formula)
}else{
// in valid formula
}
为什么不尝试这个?