Вот алгоритмическое решение, подобное jMichael's, которое перебирает выражение символ за символом и последовательно отслеживает 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);
}