我允许用户在Web表单字段中指定MySQL计算字段,该字段可能显示如下内容:

(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24


在运行时,我将用其他表列替换camelcase参数,但是在让用户将该表达式保存为报告模板的一部分之前,我想使用Math.js测试该函数的有效性,但不喜欢IF()构造。 Math.js确实允许覆盖函数名称,但是我不能使其与IF的特殊情况一起使用,因为这是保留字。

当MySQL具有某些已经具有JavaScript等效功能的函数时,如何使用Math.js测试MySQL函数是否有效?

最佳答案

您需要谨慎地使用math.js解析器测试MySQL语法,因为它们的语法不同。您将必须仔细定义所支持的语法并进行明确测试。

您可以使用math.js将表达式解析为表达式树并将其分析。通过遍历树,可以验证语法。例如:

var node = math.parse('3 * x + 2');
node.traverse(function (node, path, parent) {
  switch (node.type) {
    case 'OperatorNode': console.log(node.type, node.op);    break;
    case 'ConstantNode': console.log(node.type, node.value); break;
    case 'SymbolNode':   console.log(node.type, node.name);  break;
    default:             console.log(node.type);
  }
});
// outputs:
//   OperatorNode +
//   OperatorNode *
//   ConstantNode 3
//   SymbolNode x
//   ConstantNode 2


因此,在您的情况下,您可以解析表达式,然后分析返回的树:

var node = math.parse('(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24');
// node.traverse(...)


请参阅文档以获取更多信息:http://mathjs.org/docs/expressions/expression_trees.html

08-04 14:49