Tengo una expresión matemática válida que solo necesita terminar con algunos paréntesis de cierre para que eval() funcione. Para esto, puedo encontrar los paréntesis sin cerrar en la expresión y agregar paréntesis de cierre hasta que los paréntesis sin cerrar coincidan con los paréntesis de cierre.
Esto es lo que he hecho:
let expression = `3 * 1 * (4 - 1 - (5 * 9 * (2 - 6 / 5 + (4 - 1 - (5 * 9 * (2 - 6 / 5 - (4 - 1 - (5 * 9 * (2 - 6 / 5 + (4 - 1 - (5 * 9 * (2 - 6 / 5`; const openingParenthesisCount = (expression.match(/[(]/g) || []).length; const closingParenthesisCount = (expression.match(/[)]/g) || []).length; let unclosedParenthesisCount = openingParenthesisCount - closingParenthesisCount; try { console.log(eval(expression)); } catch (error) { // Append closing parentheses until all the parentheses are closed while (unclosedParenthesisCount) { expression += ")"; unclosedParenthesisCount--; } } // Valid expression console.log(eval(expression));He usado una expresión de prueba para esto y funciona, pero si la expresión es más larga, puede llevar algo de tiempo (pero finalmente mostrará el resultado).
¿Existe un método más fácil/rápido para lograr esto?
Sugiero usar la funcionalidad incorporada de String#repeat() y usar un solo bucle en lugar de RegExp.
const openedCount = Array.from(expression).reduce( (opened, curChar)=> { if (curChar === '(') opened++ else if (curChar === ')') opened-- return opened }, 0 ) expression += ')'.repeat(openedCount)