逻辑错误使循环无限循环,为什么?

时间:2019-11-19 20:42:17

标签: javascript

我正在尝试构建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
}

2 个答案:

答案 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) => ...)