在javascript中将数学运算符作为字符串参数转换为实数运算符

时间:2013-06-18 19:31:53

标签: javascript algorithm

我正在用javascript创建一个程序,我不知道如何实现以下功能;我的程序将诸如“+”,“ - ”和其他数学运算符之类的参数作为字符串,我想转换为实数运算符。例如(伪代码):

function calc(a,b,c, op1,op2){

  output=(a op1 b op2  c)
 }

计算值(2,3,4, “+”, “ - ”)

现在输出= 2 + 3-4。

但是,我事先并不知道我将拥有多少运营商以及数字。换句话说,我的目标是替换1,“+”,2,“ - ”,4,“+”,“(”,5,“+”,6,“)”........等等1 + 2-4 +(5 + 6).....

我怎样才能以一种好的方式实现这个目标?

3 个答案:

答案 0 :(得分:4)

好吧,你可以使用eval,但你可以这样做:

   var funcs = {
       '+': function(a,b){ return a+b },
       '-': function(a,b){ return a-b }
   };
   function calc(a,b,c, op1,op2){
      return funcs[op2](funcs[op1](a, b), c);
   }

您可以使用其他运算符轻松扩展funcs地图。

答案 1 :(得分:1)

我真的建议在这种特殊情况下使用eval

eval("var res = " + 1 + "+" + 2 + "-" + 4 + "+" + "(" + 5 + "+" + 6 + ")");
console.log(res); //10

我知道,我知道,有人说你应尽可能避免eval。他们是对的。 eval具有强大的力量,你应该只负有很大责任,特别是当你评估最终用户输入的内容时。但是如果你小心,你可以使用eval并且没问题。

答案 2 :(得分:1)

这已经很快完成了,但是应该这样做(JSFiddle here):

function executeMath() {
    if (arguments.length % 2 === 0) return null;
    var initialLength = arguments.length,
        numberIndex = (initialLength + 1)/2,
        numbers = Array.prototype.splice.call(arguments, 0, numberIndex),
        operands = Array.prototype.splice.call(arguments, 0),
        joiner = new Array(arguments.length);
    for (var i = 0; i < numbers.length; i++) {
        joiner[i*2] = numbers[i];
    }
    for (var i = 0; i < operands.length; i++) {
        joiner[1+(i*2)] = operands[i];
    }
    var command = ("return (" + joiner.join('') + ");"),
        execute = new Function(command);
    console.log(command);
    return execute();
}
console.log(executeMath(2, 3, 4, 5, "/", "+", "%"));