2015-02-04 69 views
1

我正在研究一個JS,我想創建一個簡單的遊戲,通過選擇玩家人數,每個玩家的名字以及玩家是不是經銷商。可以有每場比賽只有一個經銷商:嵌套for'loop - array undefined

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] is undefined

任何人都可以解釋爲什麼它是undefined?/我在做什麼錯?

+1

'k = 0'創建一個全局的,我不認爲你想要的! – Sukima

回答

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') { 
      ... 
     } 
    } 
} 

在我看來,這裏的邏輯錯誤是嵌套循環。我建議在一個循環中初始化所有玩家,然後確認所有玩家之後都有一個指定的經銷商。

我應該補充一點,我故意在這裏短視,並非常狹隘地關注所問的問題,忽略了我所看到的其他問題。

+0

謝謝 - 我認爲'playersArray [i] =新玩家(inputName,inputDealer);'II初始化第一個玩家並將他推到位置0的數組中。如果這是正確的,那麼第二個循環應該能夠至少檢查一下這個第一個玩家,不是嗎? – DDEX

+1

當然,但是對於'k'計數器(k = 1)的嵌套循環的第二次迭代,但是在外部循環的第一次迭代(i = 0)上呢?在執行的這一點上,playersArray [0]被定義是因爲它被插入到索引0處,但是外部循環(正在初始化你的值)沒有初始化索引1處的播放器。然而,你的內部循環正在檢查播放器在索引1.然後,它將檢查索引2。然後3。等等,雖然只有索引0的玩家已經初始化了。 – bmhkim

+0

@bmkhin:你先生,是正確的!我徹底改變了這個練習的方法,擺脫了第二個循環,並使用'if(dealerAssigned && inputDealer =='yes'){alert(「already assigned」); playersArray [i] =新玩家(inputName,'不');'它的功能就像魔術一樣。謝謝你的幫助! – DDEX

0

for循環中的for循環遍歷尚未填充的數組。

第一次迭代playersArray[j] = new Player(...)使得陣列[Player]或一個一個元素的數組!然而第二個循環正在尋找許多元素的數組。一旦你尋找playersArray[1],但只有playerArray[0]你得到undefined,所以undefined.playerDealer導致TypeError。

0

'這是你的結構stipped向下:

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 -loop試圖插入元素的數組要的大小,但你k -loop試圖也訪問整個數組,而不僅僅是初始化的部分。限制爲for (k=0; k<i+1 ;k++),所以你只檢查你以前初始化的值playersArray