如何比较JavaScript中的两个数学表达式? 例如“1 + x”和“x + 1”。将数学表达式与JavaScript进行比较
有一个JavaScript数学解析器,但我找不到比较解析表达式的逻辑: https://github.com/silentmatt/js-expression-eval/blob/master/test.js
是否还有其他选择?
感谢
如何比较JavaScript中的两个数学表达式? 例如“1 + x”和“x + 1”。将数学表达式与JavaScript进行比较
有一个JavaScript数学解析器,但我找不到比较解析表达式的逻辑: https://github.com/silentmatt/js-expression-eval/blob/master/test.js
是否还有其他选择?
感谢
您将需要一个计算机代数系统(CAS),才能真正测试两个表达式是否相等。我唯一知道的JavaScript是javascript-cas,我不确定这是否能满足您的需求。其他库如math.js和提到的js-expression-eval可以解析表达式,但错过逻辑来理解两个表达式是否相等。
一个实用的方法可能是比较两个表达式的结果对于x
的许多不同值,并查看它们是否具有相同的结果。这并不总是奏效,例如0/x+1
和x-x
每x
给出相同的结果,但它们并不完全相同。
是否有可能通过优先级重新排序由js-expression-eval生成的AST并逐个比较元素?可能会有非常复杂的情况,但我认为我只需要像“1 + x”==“x + 1”和“1 + 2 * x”==“x * 2 + 1”之类的东西。 – pablo 2014-09-26 05:43:00
我不确定这是否可以用'js-expression-eval'实现,它似乎没有给出一个节点树。你可以用math.js做到这一点,例如:运行'math.parse('1 + 2 * x')'返回一个[nodes]的树(https://github.com/josdejong/mathjs/tree/master/lib/expression/node),因此您可以遍历所有节点并在需要时对参数进行排序。在这种情况下,根节点将是一个'OperatorNode',它的属性是'op =='+'','fn =='add'','type ==“OperatorNode”',而'params'是一个包含两个参数:一个OperatorNode'*'和一个ConstantNode 1,你可以按照类型命令这些参数。 – 2014-09-26 08:02:37
如果你需要知道的只是平等,那么你可以做近似的比较:从表情
x+1
和1+x
提取变量名所以单个变量x
genere伪随机或网格集va梅毒为他们
解析与当前的变量的每一个表达设置
尝试从genered数据的所有情况下被设
你所说的“比较”是什么意思?你期待什么输出? – cbp 2014-09-25 04:53:40
我在寻找真假 – pablo 2014-09-26 05:41:02