如何计算数组形式的数学表达式?以1+2×3为例求方案
处理数组形式数学表达式的计算方案
首先看你现有代码的核心问题:
- 循环条件写反了:
i > ops.length / 2,初始i=0,0永远小于数组长度的一半,循环根本没执行,这就是加法测试没效果的直接原因。 splice用法错误:splice的第二个参数是删除的元素数量,不是索引。比如你要删除ops[i]和ops[i+1],应该用ops.splice(i, 2),而不是ops.splice(i, i)(这会删除0个元素,等于没操作)。
先修正仅处理加法的代码(无优先级场景)
// 示例:temp = "1 + 2" const temp = "1 + 2"; let ops = temp.split(" "); // 循环条件改为i < ops.length,且修改数组后调整索引 for (let i = 0; i < ops.length; i++) { if (ops[i] === "+") { // 计算左右两数的和 const result = +ops[i-1] + +ops[i+1]; // 替换i-1、i、i+1三个元素为结果 ops.splice(i-1, 3, result.toString()); // 数组长度减少2,索引回退避免跳过后续元素 i--; } } console.log(ops); // 输出 ["3"]
支持运算优先级的完整方案(先乘除后加减)
如果要处理像1+2×3这类需要遵循优先级的表达式,需要分两步遍历:先处理乘除,再处理加减。完整代码如下:
function calculateExpression(exprArray) { // 复制原数组,避免修改输入的原始数据 let ops = [...exprArray]; // 第一步:处理高优先级的乘法、除法 for (let i = 0; i < ops.length; i++) { const op = ops[i]; if (op === "*" || op === "/") { const left = +ops[i-1]; const right = +ops[i+1]; let result = op === "*" ? left * right : left / right; // 替换三个元素为计算结果 ops.splice(i-1, 3, result.toString()); i--; // 调整索引,防止跳过下一个元素 } } // 第二步:处理低优先级的加法、减法 for (let i = 0; i < ops.length; i++) { const op = ops[i]; if (op === "+" || op === "-") { const left = +ops[i-1]; const right = +ops[i+1]; let result = op === "+" ? left + right : left - right; ops.splice(i-1, 3, result.toString()); i--; } } // 最终数组仅剩一个结果元素,转为数字返回 return +ops[0]; } // 测试示例 const expr = ["1","+","2","*","3"]; console.log(calculateExpression(expr)); // 输出7,符合1+2×3的计算结果
代码说明
- 分两次遍历保证运算优先级:先处理乘除,再处理加减,符合数学运算规则。
- 每次计算后用
splice替换原数组中的三个元素(左数、运算符、右数)为结果,同时调整索引i--,避免因数组长度变化跳过后续元素。 - 使用扩展运算符
[...exprArray]复制数组,避免污染原始输入数据。
内容的提问来源于stack exchange,提问作者sleepstorm
相关产品推荐
相关产品推荐

