Вот алгоритмическое решение, подобное jMichael, которое циклически перемещает символ выражения по символу и постепенно отслеживает left / operator / right. Функция накапливает результат после каждого поворота, который находит символ оператора. Эта версия поддерживает только операторы «+» и «-», но записывается для расширения с другими операторами. Примечание: перед циклом мы устанавливаем 'currOp' в '+', потому что предположим, что выражение начинается с положительного поплавка. Фактически, в целом, я делаю предположение, что ввод аналогичен тому, что исходит от калькулятора.
function calculate(exp) {
const opMap = {
'+': (a, b) => { return parseFloat(a) + parseFloat(b) },
'-': (a, b) => { return parseFloat(a) - parseFloat(b) },
};
const opList = Object.keys(opMap);
let acc = 0;
let next = '';
let currOp = '+';
for (let char of exp) {
if (opList.includes(char)) {
acc = opMap[currOp](acc, next);
currOp = char;
next = '';
} else {
next += char;
}
}
return currOp === '+' ? acc + parseFloat(next) : acc - parseFloat(next);
}