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

JavaScript splice函数合并数组元素时失效问题咨询

计算器数组合并数字元素的问题修复

问题根源

你的代码存在三个核心问题:

  1. splice方法调用错误:equation.splice[i]是错误语法,splice是数组方法,必须用函数调用形式splice(index, deleteCount),正确写法为equation.splice(i, 1)。
  2. 遍历逻辑错误:
    • 合并元素后数组长度减少1,但你仍在递增i,导致跳过下一个需要合并的数字。
    • else分支里的i++会跳过符号后的第一个数字,引发后续合并不完整。
  3. 合并结果类型问题:合并后得到的是字符串,计算器后续计算需要数字类型,建议转为Number。

修复方案(正向遍历)

调整遍历逻辑,合并后不递增i,仅当遇到非数字对时才推进索引:

let equation = [1,2,3,"/",1,2,3];
combineNumbers();

function combineNumbers() {
  for(let i = 1; i < equation.length; ) {
    if(isFinite(equation[i-1]) && isFinite(equation[i])) {
      // 合并数字并转为Number类型
      equation[i-1] = Number(`${equation[i-1]}${equation[i]}`);
      // 正确删除当前索引的元素
      equation.splice(i, 1);
    } else {
      // 仅当当前对不是数字对时,才移动索引
      i++;
    }
  }
  console.log(equation); // 输出 [123, "/", 123]
}

更简洁的反向遍历方案

反向遍历无需调整索引,因为删除的是当前元素后面的项,不会影响前面的遍历逻辑:

let equation = [1,2,3,"/",1,2,3];
combineNumbers();

function combineNumbers() {
  // 从倒数第二个元素向前遍历
  for(let i = equation.length - 2; i >= 0; i--) {
    if(isFinite(equation[i]) && isFinite(equation[i+1])) {
      equation[i] = Number(`${equation[i]}${equation[i+1]}`);
      equation.splice(i+1, 1);
    }
  }
  console.log(equation); // 输出 [123, "/", 123]
}

内容的提问来源于stack exchange,提问作者IronLightning85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:07:26