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

如何修复splice删除连续元音时仅删除一个的问题?

移除字符串中元音的优化方案

原代码问题分析

你的函数处理不了连续元音,核心是两个问题:

  1. 遍历同时修改数组:用for...of遍历数组时,splice会缩短数组长度,导致遍历指针跳过后续元素,连续元音只被删除一个。
  2. 索引查找错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:03:37