JavaScript splice函数合并数组元素时失效问题咨询
计算器数组合并数字元素的问题修复
问题根源
你的代码存在三个核心问题:
- splice方法调用错误:
equation.splice[i]是错误语法,splice是数组方法,必须用函数调用形式splice(index, deleteCount),正确写法为equation.splice(i, 1)。 - 遍历逻辑错误:
- 合并元素后数组长度减少1,但你仍在递增i,导致跳过下一个需要合并的数字。
- else分支里的
i++会跳过符号后的第一个数字,引发后续合并不完整。
- 合并结果类型问题:合并后得到的是字符串,计算器后续计算需要数字类型,建议转为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
相关产品推荐
相关产品推荐

