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

JS使用switch语句移除字符串元音字母仅部分生效是什么原因?

问题根因
  • 循环边界错误:数组下标范围是0 ~ 数组长度-1,你写的x <= arr.length会出现越界访问,不过这不是元音漏判的核心原因。
  • 遍历同时修改数组导致索引偏移:调用splice(x, 1)删除当前位置的元音后,数组中该位置后面的所有元素会自动向前移动一位,此时循环变量x继续自增,就会直接跳过移动到当前位置的下一个元素,没有做元音判断,这就是u、a被保留的原因。
修复代码

只需要修改两处:把循环边界改成x < arr.length,删除元素后手动将x减1,确保下一轮循环能检查到刚移动过来的新元素:

function disemvowel(str) {
  let arr = str.split(''); // str -> arr
  // 修正循环边界为小于数组长度
  for (let x = 0; x < arr.length; x++) { // remove vowels
    switch(arr[x]) {
      case "a":
      case "e":
      case "i":
      case "o":
      case "u":
      case "A":
      case "E":
      case "I":
      case "O":
      case "U":
        arr.splice(x, 1);
        // 删除元素后索引回退一位
        x--;
        break;  
    }
  }
  str = arr.join('') // arr -> str
  return str;
}
其他可选实现方案

如果不限制必须用switch,还有更简洁的实现方式:

  • 倒序遍历数组:从数组末尾往前遍历删除元素,不会出现索引偏移的问题,不需要手动调整x的值
  • 正则替换:直接用正则匹配所有元音字母替换为空,一行即可实现:return str.replace(/[aeiou]/gi, ''),其中g代表全局匹配,i代表忽略大小写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:15:03