Angular7:如何评估算术字符串

时间:2019-05-17 06:21:28

标签: javascript angular typescript

我正在使用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”来做到这一点。 你知道我该怎么解决吗?

2 个答案:

答案 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"))