Js的最后一个数组项未定义

js last array item is undefined

本文关键字:未定义 数组 最后一个 Js      更新时间:2023-09-26

我正在尝试制作一款绞刑游戏,在游戏开始时要求用户输入单词。一旦有了单词,它就使用for循环将单词字母一个接一个地填充到数组中。不幸的是,由于某些原因,最后一个数组元素总是未定义的。代码(JS):

for(i=0;i<word.length;i++)
{
    if(i == word.length - 1)
    {
        wordLettersLeft = word.length;
        $("#cEText").removeAttr("style");
        $(".characterEnter").removeAttr("style");
        $("#gBtn").text("Lopeta");
        gameStarted = true;
        pcArrayLength = pcArray.length;
        lives = 4;
        alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
        alert("Vihje: " + hint);
        alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");
    }
    else
    {
        pcArray.push(word[i]);
    }
}

原因很简单:您没有将最后一个字母添加到pcArray中。让我们假设我们的单词是'bird'(因为bird 一个单词)。你的代码会遍历字母b, i和r并将它们推入数组,目前为止一切顺利。但是当它到达d时,它在位置word.length-1 -因为数组长度从1开始,但索引从0开始。您的if语句阻止它将最后一个字母推到单词。有两种解决方案:

首先,您可以简单地删除else语句:
for(i=0;i<word.length;i++){
    if(i == word.length - 1){
        wordLettersLeft = word.length;
        $("#cEText").removeAttr("style");
        $(".characterEnter").removeAttr("style");
        $("#gBtn").text("Lopeta");
        gameStarted = true;
        pcArrayLength = pcArray.length;
        lives = 4;
        alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
        alert("Vihje: " + hint);
        alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");
    }
    pcArray.push(word[i]);
}

这将推动每个字母每次!然而,有一种更有效的方法:

  for(i=0;i<word.length;i++)
      pcArray.push(word[i]);
  wordLettersLeft = word.length;
  $("#cEText").removeAttr("style");
  $(".characterEnter").removeAttr("style");
  $("#gBtn").text("Lopeta");
  gameStarted = true;
  pcArrayLength = pcArray.length;
  lives = 4;
  alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
  alert("Vihje: " + hint);
  alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");

这样,您将只执行初始代码一次,而不是每次检查if。你知道你的循环只会运行只要有字母,那么为什么还要用if呢?

正如@Shilly在评论中提到的,您可以这样做来完全放弃for循环:

pcArray = word.split('');

假设有人输入单词"Test"。对于i === 3,这是最后一次迭代,您输入if子句,您将错过else子句,这就是您所做的:

pcArray.push(word[i]);

无论你是在if还是else中,你都要这样做,所以你可以放下else子句,无论如何都要这样做

循环的最后一步不执行pcArray.push(word[i]);。很明显,最后一个值不见了。

但是如果你想把字符串转换成数组,只需这样做:

var pcArray = word.split('');