Javascript 识别操作员并执行计算

Javascript 识别操作员并执行计算,javascript,arrays,Javascript,Arrays,我有一个问题: 编写一个理解“+”、“-”和“*”操作的简单解释器。按顺序应用这些操作 使用以value的初始值开始的命令/参数对。如果遇到未知命令,请返回-1。你必须完全忽略B.O.D.M.A.S Examples of the input and output interpret(1, ["+"], [1]) → 2 interpret(4, ["-"], [2]) → 2 interpret(1, ["+", "*"], [1, 3]) → 6 interpret(5, ["+", "*"

我有一个问题:

编写一个理解“+”、“-”和“*”操作的简单解释器。按顺序应用这些操作 使用以
value
的初始值开始的命令/参数对。如果遇到未知命令,请返回-1。你必须完全忽略B.O.D.M.A.S

Examples of the input and output
interpret(1, ["+"], [1]) → 2
interpret(4, ["-"], [2]) → 2
interpret(1, ["+", "*"], [1, 3]) → 6
interpret(5, ["+", "*", "-"], [4, 1, 3]) → 6
我已经尝试将参数作为多维数组传递到下面。我正试图解决这个问题,当我这样做的时候

let operator = ["+", "-"];
let integer = 1;
let intArr = [1, 2];
let emptyInt;
let anotherInt;
let newArray = [integer, operator, intArr];
我如何使这项工作如上所述?按顺序添加每个数组

您可以使用。
ac
将其添加到第一个值。然后通过检查运算符进行加/减/除/乘

函数解释(…参数){
let operators=args[1];//获取运算符数组
设values=args[2]//数字应为第一个。
返回值.reduce((ac,val,i)=>{
//在迭代“value”时,检查“i”上的运算符
如果(运算符[i]=='+')返回ac+val;
else如果(运算符[i]='-')返回ac-val;
else如果(运算符[i]=='*')返回ac*val;
如果(运算符[i]='/')返回ac/val,则返回else;
否则返回-1;
},args[0])//“ac”最初设置为第一个值。
}
log(解释(1,[“+”],[1]))
日志(解释(4,[“-”],[2]))
log(解释(1,[“+”,“*”],[1,3]))

log(解释(5、[“+”、“*”、“-”]、[4,1,3])
您可以获取一个包含运算符所需函数的对象,并通过获取值和操作数来重新生成数组

const
fns={
“+”:(a,b)=>a+b,
“-”:(a,b)=>a-b,
“*”:(a,b)=>a*b,
“/”:(a,b)=>a/b
},
解释=(开始、运算符、值)=>
减少(
(a,b,i)=>fns中的运算符[i]
?fns[操作员[i]](a、b)
: - 1,
开始
);
log(解释(1,[“+”],[1]);//2.
日志(解释(4,[“-”],[2]);//2.
log(解释(1,[“+”,“*”],[1,3]);//6.
log(解释(5,[“+”,“*”,“-”],[4,1,3]);//6
您可以使用。首先,您可以定义一个对象,将运算符映射到可用函数,然后调用递归函数来计算结果:

const oper={
“+”:(a,b)=>a+b,
“-”:(a,b)=>a-b,
“*”:(a,b)=>a*b,
“/”:(a,b)=>a/b
};
常量解释=(n[fc,…计算],[fn,…nums])=>
fc==未定义?n:
解释(操作[fc](n,fn),计算,nums)
log(解释(1,[“+”],[1]);//2.
日志(解释(4,[“-”],[2]);//2.
log(解释(1,[“+”,“*”],[1,3]);//6.
log(解释(5,[“+”,“*”,“-”],[4,1,3]);//6
您可以这样做:--


很好,但是如果有身份不明的操作员,如何返回-1
function getOperator(number, operator, integer) {
    let result;
    switch (operator) {
        case '+':
            result = number + integer;
            break;
        case '-':
            result = number - integer;
            break;
        case '*':
            result = number * integer;
            break;
        case '/':
            result = number / integer;
            break;
    }
    return result;
}
function doOperation(array) {
    number = array[0];
    for (let i = 0; i < array[1].length; i++) {
        number = getOperator(number, array[1][i], array[2][i]);
    }
    return number;
}
doOperation([1, ["+"], [1]])