2013-06-18 56 views
0

我在javascript中創建程序,我不知道如何實現以下;我的程序以「+」,「 - 」和其他數學運算符爲參數,將其轉換爲實際運算符。例如(僞碼):將數學運算符作爲字符串參數轉換爲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

你需要支持的優先級和嵌套,或任意長度的表情? –

+0

是的,那是我的問題。 –

+1

對@基礎求解器,你可能會希望有一個合適的表達式標記器和一個解析器,以解決任何更復雜的問題(或使用eval,如果你可以信任輸入) –

回答

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地圖與其他運營商。

+0

我認爲你有比這更好的解決方案一。我沒有檢查它,但表面上看它,我試圖將基於字符串的任何長度的數學形式替換爲實際的數學形式。你不覺得這可能太冗長嗎?只是我天真的想法。 –

+0

這不會正確處理運營商的優先順序 –

+0

是的,它沒有。這也是我的想法。 –

1

我真的會建議使用eval對於這種特殊情況:

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

我知道,我知道,EVERONE說,你應該避免eval在可能的情況。他們是對的。 eval擁有很大的權力,您只能以極大的責任使用它,尤其是當您評估某些內容時,最終用戶輸入的內容。但是,如果你小心,你可以使用eval,並罰款。

+0

但是請注意,'eval'是_extremely_ slow –

+0

@JanDvorak:當然,這段代碼需要幾年的時間才能完成。 – georg

+0

@ thg435如果你經常這樣做,那麼需要幾年才能完成(而不僅僅是幾個小時或幾天)。 –

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, "/", "+", "%")); 
相關問題