2016-11-09 96 views
0

等待處理數組元素我有這個數組finalArr = [12,+,4,-,8,*,2];我想要的陣列減少到一個值,像這樣:var result = 12+4-8*2;使用減少方法

這裏是我做了什麼:

var operators = {'+' : function (a,b) {return a + b}, 
       '-' : function (a,b){return a - b}, 
       '*' : function (a,b){return a * b}, 
       '/' : function (a,b){return a/b}}; 

var opSymbols = ['+','-','*','/']; 
finalArr = [12,+,4,-,8,*,2]; 
finalArr.reduce(function (acc,next,index,arr){ 
     for (var m = 0; m < opSymbols.length; m++) { 
      var op = ''; 
      if (opSymbols[m] === arr[1]) { 
       op = opSymbols[m]; 
       acc = operators[op](arr[0],arr[2]); 
      } 
      if (index > 1 && opSymbols[m] === arr[index]) { 
       op = opSymbols[m]; 
       acc += arr[index+1]; 
      } 
     } 

     return acc; 
    }); 

我越來越finalArr.reduce行中的語法錯誤(SyntaxError:expected expression,got','),我不認爲我正在正確執行reduce方法。任何幫助?感謝

+0

所以結果應該是一個字符串,或16(或零,如果你把價值考慮到運算符優先級) –

+0

請注意,使用Robby的修復程序,您將得到結果16;但數學上,由於操作的順序,事情更加複雜。數學結果應爲0,因爲12 + 4 - 8 * 2是(12 + 4) - (8 * 2),而不是(12 + 4 - 8)* 2. –

+0

@TJCrowder這應該是一個計算器程序,所以a + b * c應該是c *(a + b) – dadadodo

回答

1

的運營商是字符串,所以你需要說出來了:

finalArr = [12,'+',4,'-',8,'*',2]; 
0

Eval is evil
但如果你想測試一下:

finalArr = [12, '+', 4, '-', 8, '*', 2]; 
 
console.log(
 
    eval(finalArr.join('')) 
 
)

0

在你的數組是一個混合字符串/ int的數組,如

var finalArr = [12,'+',4,'-',8,'*',2]; 

您可以通過下面的命令產生預期的結果

var result = finalArr.join(''); 

,如果你需要計算結果

var final = eval(result); 

希望它會幫助你;)

1

沒有reduceeval的解決方案,但具有運算符優先級。

function calculate(a) { 
 
    while (a.length > 1) { 
 
     precedence.some(function (b) { 
 
      return a.some(function (c, i) { 
 
       if (b === c) { 
 
        return operators[b](a, i); 
 
       } 
 
      }); 
 
     }); 
 
    } 
 
    return a[0]; 
 
} 
 

 
var operators = { 
 
     '+': function (a, i) { 
 
      a[i - 1] += a.splice(i, 2)[1]; 
 
      return true; 
 
     }, 
 
     '-': function (a, i) { 
 
      a[i - 1] -= a.splice(i, 2)[1]; 
 
      return true; 
 
     }, 
 
     '*': function (a, i) { 
 
      a[i - 1] *= a.splice(i, 2)[1]; 
 
      return true; 
 
     }, 
 
     '(': function (a, i) { 
 
      var j = i + 1, b; 
 
      while (j < a.length) { 
 
       if (a[j] === ')') { 
 
        b = a.splice(i + 1, j - i); 
 
        b.pop(); 
 
        a[i] = calculate(b); 
 
        return true; 
 
       } 
 
       if (a[j] === '(') { 
 
        return false; 
 
       } 
 
       j++; 
 
      } 
 
     }, 
 
     ')': 0 
 
    }, 
 
    precedence = ['(', '*', '+', '-']; 
 

 
console.log(calculate([12, '+', 4, '-', 8, '*', 2])); 
 
console.log(calculate([7, '*', 8, '-', 3.5, '*', 4]));

0

如果你真的想這樣做與減少和不使用eval

var opSymbols = ['+','-','*','/']; 
var finalArr = [12,'+',4,'-',8,'*',2]; 
var result = finalArr.reduce(function (previousValue,currentValue,currentIndex,array){ 
    var res; 
    var opr; 
    if(typeof currentValue == 'number') { 
      switch(previousValue.operator){ 
       case '+': 
        res = previousValue.value + currentValue;break; 
       case '-': 
        res = previousValue.value - currentValue;break; 
       case '*': 
        res = previousValue.value * currentValue; break; 
       case '/': 
        res = previousValue.value/currentValue; break; 
      } 
      opr = previousValue.operator; 
    } 

    else if(typeof currentValue == 'string') { 
     res = previousValue.value; 
     opr = currentValue; 
    } 

    return {'value':res,'operator': opr}; 



},{'value':0,'operator':'+'}); 

console.log(result.value); // this gives 16