2012-03-03 52 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; 
}