未定义属性上的javascript求值表达式

未定义属性上的javascript求值表达式,javascript,eval,Javascript,Eval,我需要检查一个公式是否由用户传递,并使用对象中定义的一组受限属性/值。对象属性包括: var klarf = { InspectedDiceCount: 0, FailedDiceCount: 0, PassedDiceCount: 0, UnclassifiedDiceCount: 0, InspectedDefectCount: 0, FailedDefectCount: 0, PassedDefectCount: 0, Unclassifie

我需要检查一个公式是否由用户传递,并使用对象中定义的一组受限属性/值。对象属性包括:

var klarf = {
   InspectedDiceCount: 0,
   FailedDiceCount: 0,
   PassedDiceCount: 0,
   UnclassifiedDiceCount: 0,
   InspectedDefectCount: 0,
   FailedDefectCount: 0,
   PassedDefectCount: 0,
   UnclassifiedDefectCount: 0
}
< >用户必须键入返回布尔值的任何数学表达式,以考虑公式“有效”:

如果用户指定了未定义的属性或未定义/不允许的变量,如何获取错误

validate = eval(10 + klarf.dummy > 0);    //returns true (but expected invalid formula)
validate = eval(a > b);
如果没有通过eval,是否有任何js库来执行公式计算

目标是检索在
输入文本
表单中键入的用户公式,然后检测是否: a) 公式是有效的(无论结果是真是假),因为它只使用允许的变量。有效公式如下所示:

(klarf.InspectedDiceCount > 10)
(1 > 2)
((klarf.UnclassifiedDefectCount * 100 / klarf.InspectedDefectCount) > 0.1)
klarf.PropertyThatDoesNotExists > 0
dummy_variable > 1
clarf.FailedDiceCount < 16
b) 公式无效,因为它包含未声明的变量或klarf对象属性。无效公式如下所示:

(klarf.InspectedDiceCount > 10)
(1 > 2)
((klarf.UnclassifiedDefectCount * 100 / klarf.InspectedDefectCount) > 0.1)
klarf.PropertyThatDoesNotExists > 0
dummy_variable > 1
clarf.FailedDiceCount < 16
为什么不试试这个?

用评估方法解决:

validate: function() {
    try {
        result = math.evaluate(
            $('#rule_formula').val(), {
            klarf: {
                InspectedDiceCount: 0,
                FailedDiceCount: 0,
                PassedDiceCount: 0,
                UnclassifiedDiceCount: 0,
                InspectedDefectCount: 0,
                FailedDefectCount: 0,
                PassedDefectCount: 0,
                UnclassifiedDefectCount: 0
            }
        });
        if (typeof result == "boolean") {
            $('#rule_validation').html("Valid rule detected").css({
                'color': 'green'
            });
        } else {
            $('#rule_validation').html("Invalid rule. Boolean (true/false) result expected").css({
                'color': 'red'
            });
        }
    } catch(err) {
        $('#rule_validation').html("Invalid rule. Error (" + err.message + ") detected").css({
            'color': 'red'
        });
    }
}

请指定用户输入。是字符串吗?语法错误。不需要使用
eval()
计算布尔表达式。刚好
var y=10+obj.a>100
变量y=(10+obj.a)>100就足够了。@EdLucas,但我如何将条件
var y=(10+obj.z)>100
检测为错误呢?我的目标是区分“有效和真实”条件、“有效和错误”条件和“无效”条件。在这种情况下,
obj.z
NaN
,条件不会触发错误(正如我所体验的),现在您已经指定了输入类型,这就更有意义了。您可以在问题中用
validate=eval(“10+obj.a>100”)
来说明这一点。我预计@NinaScholz很快就会推出一个算法,因为我无法预测用户会写什么。他可以使用“Obj.z”,只要'Fo.Fo'或'Value.Value'或……(…),我基本上需要考虑一个公式为“有效”,如果包含布尔比较,只使用类定义的属性。否则它是无效的。但是你怎么在公式中使用它呢?就像在公式
obj.z
中一样,但为什么不在if条件下呢?我需要将公式存储在db上(只有在有效的情况下),然后将其应用到一组包含不同obj属性值的文件上。然后,如果公式有效,我允许数据库存储。如果公式有效&&true,我将分析该文件。如果公式有效&&false,我将拒绝它。
validate: function() {
    try {
        result = math.evaluate(
            $('#rule_formula').val(), {
            klarf: {
                InspectedDiceCount: 0,
                FailedDiceCount: 0,
                PassedDiceCount: 0,
                UnclassifiedDiceCount: 0,
                InspectedDefectCount: 0,
                FailedDefectCount: 0,
                PassedDefectCount: 0,
                UnclassifiedDefectCount: 0
            }
        });
        if (typeof result == "boolean") {
            $('#rule_validation').html("Valid rule detected").css({
                'color': 'green'
            });
        } else {
            $('#rule_validation').html("Invalid rule. Boolean (true/false) result expected").css({
                'color': 'red'
            });
        }
    } catch(err) {
        $('#rule_validation').html("Invalid rule. Error (" + err.message + ") detected").css({
            'color': 'red'
        });
    }
}