嵌套' for' loop - 数组undefined

时间:2015-02-04 21:05:20

标签: javascript

我正在创建一个JS,我想创建一个简单的游戏,首先是选择玩家数量,每个玩家的名字以及玩家是否是经销商。每场比赛只能有一位经销商:

function player(playerName, playerDealer) {
    this.playerName = playerName;
    this.playerDealer = playerDealer;

}
var playerNumber = prompt('Nr of players?');
var playersArray = [];
for (i = 0; i < playerNumber; i++) {
        var j = i + 1;    

        var dealerAssigned = false; // control variable to check whether dealer has been assigned
        var inputName = prompt('Name of player nr  ' + j);
        var inputDealer = prompt('Is player ' + inputName + ' also a dealer? (yes/no)');
        playersArray[i] = new player(inputName, inputDealer);

        for (k=0;k<playerNumber;k++){ // I want to go through the players array to check if dealer has been assigned
        if (playersArray[k].playerDealer == 'yes') {
                dealerAssigned=true;    
                break;
              };    
          };

      if(dealerAssigned){ //if dealer has been assigned, don't add the current player to the array and continue with the next iteration
         alert("already assigned"); 
         continue;
            };

     };

我需要在循环中加入一个简单的测试,以检查经销商是否已被任命。如果是这样,我希望脚本只提醒“已经分配”并跳到下一个播放器。但我不断收到以下错误

  

TypeError:playersArray[k]未定义

有人可以解释为什么不明确?/我做错了什么?

3 个答案:

答案 0 :(得分:2)

你特别询问的错误在我看来是你正在迭代未定义的数组值,因为你得到的错误表明。

你得到了你想要的队员数量

var playerNumber = prompt('Nr of players?');

然后,你继续进行两次迭代(一次嵌套在另一次),其中内部循环试图访问尚未分配的值,因为外部循环尚未到达:

for (i = 0; i < playerNumber; i++) {
    playersArray[i] = new player(inputName, inputDealer);
    for (k=0; k < playerNumber; k++) {
        if (playersArray[k].playerDealer == 'yes') {
            ...
        }
    }
}

在我看来,这里的逻辑错误是嵌套循环。我建议只在一个循环中初始化所有玩家,然后确认所有玩家之后都有一个指定的经销商。

我应该补充一点,我在这里是故意的近视,并且非常关注所提出的问题,并忽略了我看到的其他问题。

答案 1 :(得分:0)

for循环中的for循环正在迭代尚未填充的数组。

第一次迭代playersArray[j] = new Player(...)生成数组[Player]一个元素的数组!然而第二个循环正在寻找许多元素的数组。一旦你找到playersArray[1],但只有playerArray[0]你得到了未定义,所以undefined.playerDealer会导致一个TypeError。

答案 2 :(得分:0)

`这是你的结构规定:

for (i = 0; i < playerNumber; i++) {
   playersArray[i] = new player(inputName, inputDealer);
   for (k=0;k<playerNumber;k++)...{

       //anything with index k > i is undefined, since your outer loop
       //hasn't initialized it yet.
   }
}

您的i循环似乎正在尝试插入数组大小的元素,但您的k循环也尝试访问整个数组而不仅仅是初始化的部分。将此限制为for (k=0; k<i+1 ;k++),因此您只需检查先前初始化的playersArray