如何修复splice删除连续元音时仅删除一个的问题?
移除字符串中元音的优化方案
原代码问题分析
你的函数处理不了连续元音,核心是两个问题:
- 遍历同时修改数组:用
for...of遍历数组时,splice会缩短数组长度,导致遍历指针跳过后续元素,连续元音只被删除一个。 - 索引查找错误:
indexOf(letter)只会返回数组中第一个匹配字符的索引,遇到重复字符时,会误删前面的元素而非当前遍历的目标。
优化方案
方案1:用filter方法(最简洁易读)
直接通过filter筛选出非元音字符,不需要修改原数组,逻辑清晰:
let string = "I'd always thought lightning was something only I could see."; let vowels = ['a', 'e', 'i', 'o', 'u'] function removeVowels(str) { return str.split('').filter(letter => !vowels.includes(letter.toLowerCase())).join(''); } console.log(removeVowels(string)); // 输出:"'d lwys thught lghtnng ws smthng nly culd s."
方案2:用正则表达式(最高效)
正则可以一次性匹配所有大小写元音,直接替换为空字符串,代码最简洁:
let string = "I'd always thought lightning was something only I could see."; function removeVowels(str) { return str.replace(/[aeiou]/gi, ''); } console.log(removeVowels(string)); // 输出:"'d lwys thught lghtnng ws smthng nly culd s."
说明:/[aeiou]/gi里的g表示全局匹配所有元音,i表示忽略大小写,覆盖所有元音情况。
方案3:倒序遍历数组(必须修改原数组时用)
如果一定要通过修改数组实现,倒序遍历可以避免splice导致的元素跳过问题——从后往前删,前面元素的索引不会受影响:
let string = "I'd always thought lightning was something only I could see."; let vowels = ['a', 'e', 'i', 'o', 'u'] function removeVowels(str) { let stringArray = str.split(''); for (let i = stringArray.length - 1; i >= 0; i--) { if (vowels.includes(stringArray[i].toLowerCase())) { stringArray.splice(i, 1); } } return stringArray.join(''); } console.log(removeVowels(string)); // 输出:"'d lwys thught lghtnng ws smthng nly culd s."
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

