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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 07:36:02