JavaScript实现字符串数字前置功能时代码运行异常如何解决
问题排查
你编写的代码存在3个核心错误:
- 错误使用
pop()方法:Array.pop()不接收任何参数,固定删除数组的最后一个元素并返回,无法实现删除指定索引i对应元素的需求,该场景下应该用Array.splice(i, 1)。 - 遍历逻辑存在遗漏:你在遍历过程中动态缩短了
rev数组的长度,但每次循环固定执行i++,会导致匹配到数字并删除元素后,下一个元素前移到当前i的位置,直接被跳过不校验,最终漏匹配部分数字。 - 操作逻辑不规范:
emptyArr声明为数组,但使用+=拼接会触发隐式类型转换转为字符串,虽然不直接影响最终输出,但不符合数组操作的预期逻辑。
修正方案
方案1:基于原有逻辑修改
function frontNum(str) { let numStr = ''; let charArr = str.split(""); // 单个字符校验不需要加g修饰符 let expression = /\d/; // 去掉固定i++,匹配到数字时不递增索引,避免跳过元素 for(let i = 0; i < charArr.length; ) { if (expression.test(charArr[i])) { // 删除当前索引的数字,拼到数字串中 numStr += charArr.splice(i, 1); } else { i++; } } console.log(numStr + charArr.join('')); } frontNum("2 plus 3 is = 5!"); // 输出:235 plus is = !
注:你给出的预期输出末尾缺少原字符串结尾的
!,属于预期描述笔误,代码执行结果会保留所有非数字字符的原始顺序。
方案2:更简洁的正则实现
直接用正则匹配提取所有数字,再删除原字符串中的数字,拼接即可,性能和可读性更优:
function frontNum(str) { // 提取所有数字拼接,匹配不到数字时返回空字符串避免报错 const nums = str.match(/\d/g)?.join('') || ''; // 删除原字符串中所有数字 const restStr = str.replace(/\d/g, ''); console.log(nums + restStr); }
内容的提问来源于stack exchange,提问作者Moose9000
相关产品推荐
相关产品推荐

