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
相关产品推荐
相关产品推荐

