我正在用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).....
我怎样才能以一种好的方式实现这个目标?
答案 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, "/", "+", "%"));