То, что вы пытаетесь сделать, на самом деле немного сложно, потому что определенные строковые значения (например, *
) должны запускать определенные операции (например, умножение) .
Один способ обработкиэто с нижеприведенной функцией operation
. Эта функция запускается один раз для каждой операции, выбранной пользователем.
Функция evaluate
предполагает, что вы уже собраличисла в один массив и операторы в отдельный массив. (Это разделение помогает предотвратить ошибки типов и позволяет легко определить, сколько операций необходимо выполнить.) Функция накапливает математический результат в resultSoFar
переменная и печатает ее, когда не осталось операций для выполнения.
let nums = [8, 5, 2];
let ops = ["*", "+"];
evaluate(nums, ops);
function operation(a, operator, b){ // eg: operation(8, "*", 5)
switch (operator){
case "+": return a + b;
case "-": return a - b;
case "*": return a * b;
case "/": return a / b; // This will fail spectacularly if b is zero
default:
console.log("Unknown operator: " + operator);
return NaN;
}
}
function evaluate(numsArray, opsArray){
// Requires numsArray to have exactly one item more than opsArray
if(opsArray.length + 1 != numsArray.length){
console.log("Error: Array lengths mismatch");
return; // Function will stop here if lengths aren't compatible
}
// Starts out with the first number
let resultSoFar = numsArray[0];
// We care about the index of each item, which is the second argument
// to the anonymous function that we pass to `Array.forEach`.
// The first argument is not important to us, as its name implies.
opsArray.forEach(function(_, index){
// Applies the operation to `resultSoFar` and the next number
resultSoFar = operation(resultSoFar, opsArray[index], numsArray[index + 1]);
// (In the example, there are two operations to perform:
// The first time through the loop, 8 * 5 = 40
// The second time through the loop, 40 + 2 = 42)
});
console.log(resultSoFar);
}
Я оставляю вам право собирать значения от пользователя (и обновлять отображение после каждой записи.)
Возможно, вы захотите использовать функцию parseInt
для преобразования значений из входных данных в числовые значения.
Примечание. Функция evaluate
может быть реализована более кратко с помощью функции Array.reduce
, но в этом примере используется более подробный синтаксис, чтобы его было легче прочитать любому незнакомому человеку.с этой (очень полезной) функцией.