You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算数组形式的数学表达式?以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:01:18