2012-03-03 17 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()); 

このコードは機能しますが、ランダムな値を生成した後に、名前の代わりに "undefined"を出力することがあります - http://jsbin.com/uriwal/edit#sourceなぜですか?連想配列参照で未定義

答えて

2

ブロック(elseブロック)を再試行すると、新しい値が返されません。あなたは新しいアイテムを選んでいる、現在

return getRandomPresident(); 

が、関数は、それを返さないように、戻り値はundefinedです:あなたはを通して戻り値を渡す必要があります。

+0

が、なぜ正確に第2の戻り?私はちょうどルーチンを呼び出すことができると思って、それが適切な値を持っていればそれは戻ってくるでしょう。 – DrStrangeLove

+0

@DrStrangeLove:おそらく、この単純化された例は役立ちます:http://jsfiddle.net/8QTC9/。 'return'を1つ取り除くと、" chain "が壊れます。 – pimvdb

0

私の推測では、getRandomInt()関数は連想配列にはない0を返すことができます。

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

EDIT:あなたはgetRandomInt(1、max)を持っている、ということ スクラッチだけif節でタイトなチェックを作成します。いずれにしても、なぜ再帰関数があるのでしょうか?ただ、この操作を行います。

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

//これは、これに

+0

'getRandomInt'は最後の' + min'のため0を返すことができません – JaredPar

0

変更機能を助け、リソース 希望を返す:

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