我正在尝试构建JavaScript devowelizer,但是正在产生无限循环。 我希望Stack Overflow上的某人可以提供帮助吗?
代码=>
let userWord = prompt("Type a word to devowelize: ");
userWord = Devowelize(userWord);
alert(userWord);
function Devowelize(word) {
for (let i = 0; i <= word.length; i++) {
let eatChars = "aeiou"
for (let i2 = 0; i2 <= eatChars.length;) {
if (word[i] == eatChars[i2] &&
word[i] != "") {
word = word.replace(word[i], "");
} else {
i2++;
}
}
}
return word
}
答案 0 :(得分:1)
您在此处for (let i = 0; i <= word.length; i++)
中使用的这一部分i <= word.length
是不正确的,因为在代码之后,您将尝试使用word
索引来访问数组i
,因此在最后一次迭代中,您将访问数组未定义的索引。javascript中数组的最后索引始终为 arrayLength-1 ,如果您访问的内容不在数组中,则会得到一个未定义的值,如果您在for (let i2 = 0; i2 <= eatChars.length;)
处执行了相同的操作,则将生成无限循环,但第一个循环是代码中无限循环的原因
答案 1 :(得分:0)
您的解决方案几乎已经存在,但是您正在尝试以一种非常round回的方式解决此问题。让我们使其更容易理解。
在JavaScript中,您可以轻松地检查一个字符串是否包含另一个字符串。例如,如果我们要检查字符是否在字符串中,则可以执行以下操作:
let eatChars = "aeiou"
eatChars.includes('e') === true
因此,知道我们可以在一个语句中做到这一点,让我们重用您已有的一些代码,并用字符“ e”代替单词中的字符。
let outWord = ""
// '<= word.length' becomes this, because the string positions only go up to 'word.length - 1
for (let i = 0; i < word.length; i++) {
let eatChars = "aeiou"
if (!eatChars.includes(word[i])) { // so the character isn't a vowel
outWord += word[i]
}
}
return outWord
评论提到学习“地图”和“过滤器”。如果您愿意,我建议为此使用减速器!您可以尝试这样的事情:
const devowel = (word) => Array.from(word).reduce((out, currentCharacter) => ...)