为何我的去元音函数无法移除元音,仅返回原字符串?
问题分析与解决
你的代码存在两个核心问题,导致无法正确移除字符串中的元音:
forEach循环内的赋值无法修改原数组
forEach遍历中的letter是数组元素的副本,给letter = ""只是修改了这个临时变量,原数组strArray里的对应元素完全没变化,自然最终拼接后还是原字符串。元音大小写匹配逻辑错误
你的vowels数组全是小写字母,vowels[i].toLowerCase()结果还是小写,根本匹配不到大写的元音(比如'A'、'E'),这些大写元音会被保留下来。
修正方案一:使用map生成处理后的新数组(推荐)
map方法可以直接返回每个元素处理后的结果,生成新数组后再拼接:
function disemvowel(str) { const vowels = ['a', 'i', 'o', 'u', 'e']; return str.split('').map(letter => { // 将当前字母转为小写,判断是否属于元音 if (vowels.includes(letter.toLowerCase())) { return ''; } return letter; }).join(''); }
修正方案二:通过forEach的索引修改原数组
如果坚持要用forEach,需要通过索引直接操作原数组元素:
function disemvowel(str) { const vowels = ['a', 'i', 'o', 'u', 'e']; const strArray = str.split(''); strArray.forEach((letter, index) => { if (vowels.includes(letter.toLowerCase())) { strArray[index] = ''; } }); return strArray.join(''); }
更简洁的方案:正则表达式替换
用正则一次性匹配所有大小写元音并替换为空,代码最简洁:
function disemvowel(str) { // [aeiou]匹配元音,g表示全局替换,i表示忽略大小写 return str.replace(/[aeiou]/gi, ''); }
内容的提问来源于stack exchange,提问作者user20907202
相关产品推荐
相关产品推荐

