在jquery中识别表达式字符串内的变量

时间:2019-07-12 12:40:14

标签: jquery

我需要在jquery中创建一个函数,在该函数中我有一些输入字段(数字)...以及一个最终的输入字段文本,名为Formula。

数字的输入字段可以有区别地添加,并且每个ID都应使用ID LETTERS_唯一地添加到唯一标识符作为表达式变量。

在输入字段(用于数字)中,我只能插入digitsdot

在公式内部,我可以创建一个文本表达式,例如:((a + b) / c) + 10

对于公式输入,我只能插入:digits . ( ) + - * /和字母az

我需要检测并从公式中提取所有变量。因此,我可以迭代所有文档以按ID搜索变量并收集每个值。

计算不是问题,我可以使用jquery expression builder plugin

我只需要检测公式字符串中的变量即可。

所以在一个真实的例子中:

<input type="text" id="variable_a" value="16">

<input type="text" id="varb" value="4">

<input type="text" id="c" value="2">

<input type="text" id="formula" value="(a + b) / c + 10">

<button id="btn">CALCULATE</button>

...

$(document).ready(function() {
   $("#btn").on("click", function() {

       var formula = $("#formula").val();

       // HELP TO DETECT VARIABLES INSIDE STRING (THEY ARE ONLY LETTERS AND _ )???

       ...

       // I NEED TO CREATE THIS ARRAY BUT HOW???

       var options_formula = {
         variables: [
        {
          name: 'a',
          value: 16
        },
        {
          name: 'b',
          value: 4
        },
        {
          name: 'c',
          value: 2
        }
        ]
       };

       var expBuilder = $(#formula).expressionBuilder(options_formula);

       alert(expBuilder.runExpression());

   });
});

有人建议从公式字符串中检测变量(字母或带有_的字母)吗?

1 个答案:

答案 0 :(得分:1)

我建议使用mathjs parser

要获取所有变量名,可以使用Expression trees: traverse() callback

var scope = {};
formulaParsed.traverse(function (node, path, parent) {
    if (node.type == 'SymbolNode') {
        var val = +$('#variable_' + node.name).val();
        scope[node.name] = isNaN(val) ? 0 : val;
    }
});

现在,您的问题是如何将变量名链接到输入字段。我修改了ID。

$('#btn').on('click', function (e) {
    var formula = $('#formula').val();
    var formulaParsed = math.parse(formula);

    var scope = {};

    formulaParsed.traverse(function (node, path, parent) {
        if (node.type == 'SymbolNode') {
            var val = +$('#variable_' + node.name).val();
            scope[node.name] = isNaN(val) ? 0 : val;
        }
    });

    console.log(scope);

    var formulaCompiled = formulaParsed.compile();
    try {
        var result = formulaCompiled.evaluate(scope);
        $('#result').val(result);
    } catch (e) {
        $('#result').val(e.message);
    }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.0.3/math.min.js"></script>


<input type="text" id="variable_a" value="16">

<input type="text" id="variable_b" value="4">

<input type="text" id="variable_c" value="2">

<input type="text" id="formula" value="(a + b) / c + 10">

<input type="text" id="result" value="">

<button id="btn">CALCULATE</button>