2012-03-03 57 views
0
var candidates = {   
    "1":"Barack Obama", 
    "2":"Mitt Romney", 
    "3":"Dennis Kucinich", 
    "4":"Quentin Tarantino", 
    "5":"Count Dracula" 
}; 



    function getRandomInt(min, max){ 
return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

Object.size = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

function getRandomPresident(){ 
    var num = getRandomInt(1, Object.size(candidates)); 
    if (num!=5){ 

    alert(num); 
    var key = num.toString(); 
    var res = candidates[key]; 

    return res; 



    } else { 

     getRandomPresident(); 

    } 

    } 


alert(getRandomPresident()); 

此代碼的工作,但有時它生成的輸出而不是名稱「未定義」隨機值之後 - http://jsbin.com/uriwal/edit#source爲什麼?未定義的關聯數組查找

回答

2

當再次嘗試(在else塊),你不回新值。你應該通過傳遞返回值:

return getRandomPresident(); 

目前,你挑選一個新的項目,但作爲函數不會返回,返回值是undefined

+0

但到底爲什麼第二回?我想我可能只是調用程序,它會返回,如果它得到正確的值.. – DrStrangeLove 2012-03-03 17:02:57

+0

@DrStrangeLove:也許這簡單的例子可以幫助:http://jsfiddle.net/8QTC9/。如果你刪除一個'return',那麼這個「鏈」就會被打破。 – pimvdb 2012-03-03 17:04:48

0

我猜getRandomInt()函數可以返回0,關聯數組沒有。只要創建的,如果從句中作更嚴格的檢查:

if (num >= 1 && num <= 5) { 
    // do stuff 
} 

編輯: 劃痕,你必須getRandomInt(1,最大值)。無論如何,爲什麼即使有遞歸函數呢?只是這樣做:

var num = 0; 
while ((num = getRandomInt(1, ...)) > 5) { 
    num = getRandomInt(1, ...); 
} 

//返回資源 希望這有助於

+0

'getRandomInt'不能返回0,因爲最後的'+ min' – JaredPar 2012-03-03 16:54:53

0

更改功能,這一點:

function getRandomInt(min, max){ 
    return Math.floor(Math.random() * (max - min)) + min; 
}