Javascript 嵌套';对于';循环数组未定义

Javascript 嵌套';对于';循环数组未定义,javascript,Javascript,我正在开发一个JS,我想创建一个简单的游戏,首先选择玩家数量、每个玩家的名字以及一个玩家是否是庄家。每个游戏只能有一个经销商: function player(playerName, playerDealer) { this.playerName = playerName; this.playerDealer = playerDealer; } var playerNumber = prompt('Nr of players?'); var playersArray = [];

我正在开发一个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;
            };

     };
函数播放器(playerName,playerDealer){
this.playerName=playerName;
this.playerDealer=playerDealer;
}
var playerNumber=prompt('n个玩家?');
var playersArray=[];
对于(i=0;i对于(k=0;k,我认为您特别询问的bug是,您正在迭代未定义的数组值,正如您得到的错误所表明的那样

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

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') {
            ...
        }
    }
}
(i=0;i{ PlayerArray[i]=新玩家(inputName,inputDealer); 对于(k=0;k
在我看来,这里的逻辑错误是嵌套循环。我建议只在一个循环中初始化所有玩家,然后验证所有玩家都有指定的经销商


我应该补充一点,我在这里故意目光短浅,只关注所问的问题,而忽略了我看到的其他问题。

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


第一次迭代
playersArray[j]=新玩家(…)
使数组
[Player]
或一个数组成为一个元素!但是第二个循环正在寻找一个包含许多元素的数组。一旦你寻找
playersArray[1]
,但是只有
playerArray[0]
您未定义,因此
未定义。playerDealer
会导致类型错误。

`这是您的结构,请点击:

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=0;i{ PlayerArray[i]=新玩家(inputName,inputDealer); for(k=0;ki是未定义的,因为您的外循环 //还没有初始化它。 } }
似乎您的
i
-循环正在尝试插入数组大小的元素,但您的
k
-循环正在尝试访问整个数组,而不仅仅是初始化的部分。请将此限制为
(k=0;k
k=0
创建了一个全局,我想你不会想要的!谢谢-我想通过
playersArray[I]=新玩家(inputName,inputDealer)
I我初始化第一个播放器,并在position 0上将其推入数组。如果这是正确的,那么第二个循环应该至少能够检查第一个播放器,不是吗?当然,但是在嵌套循环的第二次迭代中使用“k”计数器(k=1),但在外部循环的第一次迭代中(I=0)如何?在执行的这一点上,定义了PlayerArray[0],因为它是在索引0处插入的,但外部循环(正在初始化值)尚未初始化索引1处的播放机。但您的内部循环正在检查索引1处的播放机。然后,它将检查索引2处的播放机。然后检查索引3处的播放机。依此类推,而只有索引0处的播放机已初始化。@bmkhin:您说得对!我完全改变了此练习的方法,去掉了第二个循环,并使用了
if(dealerAssigned&&inputDealer=='yes'){alert(“已分配”);PlayerArray[i]=新玩家(inputName,'no');
,效果非常神奇。感谢您的帮助!