Aquí hay una matriz
getMathResult(['200', '+', 300])Necesito convertir todos los datos en una expresión matemática y ejecutarla. ¿Cómo hacerlo?
ps tenemos que hacerlo sin
evaleval puede hacer eso:
"La función eval() evalúa el código JavaScript representado como una cadena".
console.log( eval('200' + '+' + 300) ) Ahora para la parte de la matriz:
(El espaciado es para facilitar la lectura)
console.log( eval( ['200', '+', 300].join('') ) )De nada.
Has editado tu pregunta pidiendo hacerlo sin eval , así que:
let arr = ['200', '+', 300, '-', '50'] let sum = 0 let operator = '+' // assume as default let validOps = '+-' // place here all supported operations for ( let item of arr ){ if (+item){ // "+item" casts a string to a number, or to NaN if( operator == '+' ) sum = sum + +item else if ( operator == '-' ) sum = sum - +item } else if( validOps.includes(item) ) operator = item } console.log(sum)Y así sucesivamente para cada operador que desee admitir :)
Puede reducir la matriz y realizar un seguimiento de la operación anterior. Cuando llegue a un nuevo número, simplemente aplique la operación actual y vuelva a establecerla en nulo.
const getMathResult = (tokens) => tokens.reduce((acc, token, index, all) => { if (!isFinite(token)) return { ...acc, op: token } if (!acc.op) return { ...acc, op: null, total: +token } switch (acc.op) { case '+': return { ...acc, op: null, total: acc.total + (+token) } case '-': return { ...acc, op: null, total: acc.total - (+token) } case '*': return { ...acc, op: null, total: acc.total * (+token) } case '/': return { ...acc, op: null, total: acc.total / (+token) } } return acc; }, { op: null, total: 0 }).total; console.log(getMathResult(['200', '+', 300])); // 500 console.log(getMathResult([48, '/', 4])); // 12 console.log(getMathResult([5, '+', 2, '*', 3])); // 21 (left-to-right vs PEMDAS)Aquí hay una versión alternativa que puede ser más fácil de seguir:
const getMathResult = (tokens) => tokens.reduce((acc, token, index, all) => { let { op, total } = acc; if (isFinite(token)) { if (op) { switch (op) { case '+': { total += +token; break; } case '-': { total -= token; break; } case '*': { total *= token; break; } case '/': { total /= token; break; } } } else { total = +token } } else { op = token; } return { ...acc, op, total }; }, { op: null, total: 0 }).total; console.log(getMathResult(['200', '+', 300])); // 500 console.log(getMathResult([48, '/', 4])); // 12 console.log(getMathResult([5, '+', 2, '*', 3])); // 21 (left-to-right vs PEMDAS)