我正在使用Angular 7,我想评估一个以字符串形式接收的算术函数,如下所示:
我从一个数字服务中获得一个“值”。我还得到一个“规则”,以@Input参数的形式应用于此值,它是一个字符串,可以包含“>”,“ <”和“ ==”。 示例:
value = 10;
rule = ">2"
然后我要应用该规则并检查其是否正确:
if (10 > 2) {
console.log("this rule applies!");
}
我尝试使用这样的eval:
const strValue: string = value.toString();
const expression = strValue.concat(rule);
if (eval(expression)) {
console.log("this rule applies!");
}
但是我遇到一个错误:
拒绝将字符串评估为JavaScript,因为以下内容安全策略指令中不允许使用'unsafe-eval'脚本源:“ script-src'self''unsafe-inline'”。
所以我想我不应该使用“ eval”来做到这一点。 你知道我该怎么解决吗?
答案 0 :(得分:2)
您可以获取运算符并为每个运算符使用一个函数。
function evaluate(value, rule) {
const
operators = {
'<': (a, b) => a < b,
'>': (a, b) => a > b,
'==': (a, b) => a == b
},
[op, value2] = rule.match(/^(<|>|==)|.*$/g);
return operators[op](value, value2);
}
console.log(evaluate(10, '<2'));
console.log(evaluate(10, '>2'));
console.log(evaluate(10, '==2'));
console.log(evaluate(10, '==10'));
答案 1 :(得分:2)
您可以使用正则表达式(\D+)(\d+)
来获取任何运算符,后跟数字。您可以选择扩展switch
来添加更多运算符。
function evaluate(value, rule) {
const [,operator, number] = rule.match(/(\D+)(\d+)/)
switch(operator) {
case ">" : return value > number
case "<" : return value < number
case "==" : return value == number
}
return null
}
console.log(evaluate(3, ">1"))
console.log(evaluate(3, "<2"))
console.log(evaluate(3, "==3"))