如何用JavaScript删除单词中首次出现的元音?代码故障排查
问题:删除单词中首次出现的元音的JS函数无效
我正在开发一款JavaScript程序,目标是删除单词中首次出现的元音。示例如下:
原文本:quick brown fox jumps over the lazy dog
预期输出:th qck brwn fox jumps over the lzy dog
但编写的disappearString函数始终输出原句子,无任何修改,相关代码及测试用例如下:
disappearString = (myString, toErase) => { let newString = myString.split(); let newErase = toErase.split(); for(let i = 0; i < newString.length; i++){ if(newString[i] === newErase[i]){ console.log(newString.delete(toErase[i])); } } return newString.join(); } let testStrings = [ "the quick brown fox jumps over the lazy dog", "hello world", "software engineering is fun", "i like javascript", "clown case", "rhythms" ] let stringToDisappear = "aeiou" let correctStrings = [ "th qck brwn fox jumps over the lzy dog", "hll world", "sftwr engneering is fn", " lik jvascript", "clwn cs", "rhythms" ] for (let strIdx = 0; strIdx < testStrings.length; strIdx++) { let test = testStrings[strIdx]; let correct = correctStrings[strIdx]; let got = disappearString(test, stringToDisappear); if (got == correct) { console.log(`${strIdx + 1}: Testing ${test}: Correct!`); } else { console.log(`${strIdx + 1}: Testing ${test}: Wrong, got ${got}, expected ${correct}`); } }
原代码的问题分析
- 拆分字符串错误:
split()无参数时不会拆分字符或单词,会返回仅包含原字符串的数组。按单词拆分需用split(' '),按字符拆分需用split('')。 - 循环逻辑错误:遍历数组索引
i时,newString[i](原字符串整体或单词)与newErase[i](元音字符)的索引对应关系不成立,无法匹配到目标元音。 - 数组操作错误:JavaScript数组没有
delete方法,使用delete仅会将元素设为undefined,不会真正删除元素;修改数组应使用splice或过滤方法。 - 未按需求处理单个单词:需求是删除每个单词中首次出现的元音,必须先拆分出每个单词,单独处理后再拼接成句子。
修正后的代码
const disappearString = (myString, toErase) => { // 按空格拆分单词 const words = myString.split(' '); // 转换元音字符串为Set,提升查找效率 const vowels = new Set(toErase.split('')); // 逐个处理单词:删除第一个出现的元音 const processedWords = words.map(word => { for (let i = 0; i < word.length; i++) { if (vowels.has(word[i])) { // 截取元音前后的字符并拼接,实现删除效果 return word.slice(0, i) + word.slice(i + 1); } } // 单词无元音时直接返回原单词 return word; }); // 拼接处理后的单词为完整句子 return processedWords.join(' '); } // 测试用例保持不变 let testStrings = [ "the quick brown fox jumps over the lazy dog", "hello world", "software engineering is fun", "i like javascript", "clown case", "rhythms" ] let stringToDisappear = "aeiou" let correctStrings = [ "th qck brwn fox jumps over the lzy dog", "hll world", "sftwr engneering is fn", " lik jvascript", "clwn cs", "rhythms" ] for (let strIdx = 0; strIdx < testStrings.length; strIdx++) { let test = testStrings[strIdx]; let correct = correctStrings[strIdx]; let got = disappearString(test, stringToDisappear); if (got == correct) { console.log(`${strIdx + 1}: Testing ${test}: Correct!`); } else { console.log(`${strIdx + 1}: Testing ${test}: Wrong, got ${got}, expected ${correct}`); } }
修正说明
- 拆分与拼接逻辑:用
split(' ')拆分单词,处理完成后用join(' ')拼接回完整句子。 - 元音查找优化:将元音字符串转换为
Set,大幅提升字符查找效率。 - 单词处理逻辑:对每个单词遍历字符,找到第一个元音后用
slice方法截取并拼接前后部分,实现删除第一个元音的效果;无元音的单词直接返回。 - 语法规范:使用
const声明常量,避免不必要的变量重赋值,符合现代JavaScript开发规范。
内容的提问来源于stack exchange,提问作者FreddyKruger75
相关产品推荐
相关产品推荐

