Javascript 由于For循环,文本框计算器无法正常工作

Javascript 由于For循环,文本框计算器无法正常工作,javascript,Javascript,我正在创建一个基于文本的计算器,因此它必须遵循PEMDAS的规则,我已经完成了大部分工作,但我注意到了一些有关它的内容 “3x4/6/6”就是一个例子。所以它所做的是((3x4)/(6/6))一个较长的例子是“1+2+3+4+5+6+7+8”,它所做的是((1+2)+(3+4))+((5+6)+(7+8)),它得到的答案是相同的,它不是从左到右做的 所以它会做其他的操作。我知道它是混乱的,因为for循环,但我不知道从哪里开始修复它 但我需要的是一种方法,它总是对第一个乘法或除法符号进行运算,尽管

我正在创建一个基于文本的计算器,因此它必须遵循PEMDAS的规则,我已经完成了大部分工作,但我注意到了一些有关它的内容

“3x4/6/6”就是一个例子。所以它所做的是((3x4)/(6/6))一个较长的例子是“1+2+3+4+5+6+7+8”,它所做的是((1+2)+(3+4))+((5+6)+(7+8)),它得到的答案是相同的,它不是从左到右做的

所以它会做其他的操作。我知道它是混乱的,因为for循环,但我不知道从哪里开始修复它

但我需要的是一种方法,它总是对第一个乘法或除法符号进行运算,尽管我不知道怎么做

目前我的代码是:

   for (i = 0; i < OO.length; i++) {
     o = OO[i]
     if (e[OO[i]] === "*") {
       console.log(e)
       result = e[o - 1] * e[o + 1]
       e.splice(o - 1, 3, result)
     }
     if (e[OO[i]] === "/") {
       console.log(e)
       result = e[o - 1] / e[o + 1]
       e.splice(o - 1, 3, result)
     }
   }
 } 
for(i=0;i
e=等式,OO等于操作顺序或所有操作都是

因此,如果方程是上面的例子,它将每隔一段时间标记一次,因为符号的位置是[1,3,5]。代码是

 const s1 = SE,
    calcN = str => str.split(/(\+|\-|\(|\)|\*|\x|\/|\^)/).map(x => isNaN(x) ? x : Number(x));
  var Equation = calcN(s1)

  function CFO(e) {
    for (i = 0; i < e.length; i++) {
      if (e[i] === "^") {
            OO.push(i)
            } 
            if (e[i] === "*" || e[i] === "x" || e[i] === "/") {
            OO.push(i)
            } 
            if (e[i] === "+" || e[i] === "-") {
        OO.push(i)
      }
    }
  }
const s1=SE,
calcN=str=>str.split(/(\+\-\(\\\)\*\*\x\/\^)/).map(x=>isNaN(x)?x:Number(x));
var方程=calcN(s1)
职能首席财务官(e){
对于(i=0;i
我有这样的程序,所以它按顺序排列,从技术上讲,因为乘法和除法是同时进行的,所以我同时排列它们

所以我需要修正的是,它不是做其他的每一个操作,而是先做一个,然后再做一个,然后再做下一个

这是我的全部代码:

function calc() {
  var SE = document.getElementById("EQ").value
  var OO = [] //Operations Order
  var o, x, y, result;
  const s1 = SE,
    calcN = str => str.split(/(\+|\-|\(|\)|\*|\x|\/|\^)/).map(x => isNaN(x) ? x : Number(x));
  var Equation = calcN(s1)

  function CFO(e) {
    for (i = 0; i < e.length; i++) {
      if (e[i] === "^") {
            OO.push(i)
            } 
            if (e[i] === "*" || e[i] === "x" || e[i] === "/") {
            OO.push(i)
            } 
            if (e[i] === "+" || e[i] === "-") {
        OO.push(i)
      }
    }
  }

  function Calc(e) {
    CFO(e)
        if (e.indexOf('(')>-1) {
    var PE = e.slice(e.indexOf('(') + 1, e.indexOf(')'))
    console.log(PE+" Parenthesis")
        console.log(e)
        Calc(PE)
        e.splice(e.indexOf('(') - 1, e.indexOf(')')+2,PE[0])
            }
    for (j = 0; j < e.length; j++) {
      for (i = 0; i < OO.length; i++) {
        o = OO[i]
        if (e[OO[i]] === "^") {
                    console.log(e)
          result = Math.pow(e[o - 1], e[o + 1])
          e.splice(o - 1, 3, result)
        }
      }
    } //Exponent
    for (j = 0; j < e.length; j++) {
      for (i = 0; i < OO.length; i++) {
        o = OO[i]
        if (e[OO[i]] === "*") {
          console.log(e)
          result = e[o - 1] * e[o + 1]
          e.splice(o - 1, 3, result)
        }
        if (e[OO[i]] === "/") {
          console.log(e)
          result = e[o - 1] / e[o + 1]
          e.splice(o - 1, 3, result)
        }
      }
    } //Multiply and Divide
      for (j = 0; j < e.length; j++)
        for (i = 0; i < OO.length; i++) {
          o = OO[i]
                    if (e[o] === "-") {
            console.log(e)
            result = e[o - 1] + -(e[o + 1])
            e.splice(o - 1, 3, result)
          }
          if (e[o] === "+") {
            console.log(e)
            result = e[o - 1] + e[o + 1]
            e.splice(o - 1, 3, result)
          }
        }
    } //Add and Subtract
  Calc(Equation)
  console.log(Equation)

}
函数计算(){
var SE=document.getElementById(“EQ”).value
var OO=[]//操作顺序
变量o,x,y,结果;
常数s1=SE,
calcN=str=>str.split(/(\+\-\(\\\)\*\*\x\/\^)/).map(x=>isNaN(x)?x:Number(x));
var方程=calcN(s1)
职能首席财务官(e){
对于(i=0;i-1){
var PE=e.slice(e.indexOf('(')+1,e.indexOf(')'))
console.log(PE+“括号”)
控制台日志(e)
计算(PE)
e、 拼接(e.indexOf('(')-1,e.indexOf(')'))+2,PE[0])
}
对于(j=0;j