2012-11-21 52 views
0

我在寫一個腳本,onload會將類添加到12個DIV中的隨機4中,然後從陣列中刪除DIV的ID。從數組中獲取隨機項,在for循環中,然後從數組中刪除

我有一個數組設置,其中包含所有12個DIV ID。

有時當我重新加載頁面時,4個DIV有這個類,其他時間只有3個DIV有這個類。

有點卡住爲什麼發生這種情況。 我註釋掉從陣列碼刪除,看看是否真的是問題,但還是同樣的問題。

這裏是我的代碼:

//Randomize Which Shoes Are Positive And Negative 
function randomizeShoes(){ 
    allGroundShoes = new Array('ground_black_1','ground_black_2','ground_brown_1','ground_brown_2','ground_clown_1','ground_clown_2','ground_disco_1','ground_disco_2','ground_moccasins_1','ground_moccasins_2','ground_red_1','ground_red_2'); 
    for(var i=0; i < 4; i++){ 
     randomAllGroundShoes = allGroundShoes[Math.floor(Math.random() * allGroundShoes.length)]; 
     $('#'+randomAllGroundShoes+'').addClass('shoeNegitive'); 
     //randomShoeID = allGroundShoes.indexOf('randomAllGroundShoes'); 
     //if(randomShoeID != -1){ allGroundShoes.splice(randomShoeID, 1); } 
    } 
} 
+0

'Math.floor(的Math.random()* allGroundShoes.length)'需要是'Math.floor(的Math.random()* allGroundShoes.length - 1)'因爲數組從0開始。長度將返回12,但'allGroundShoes [12]'將不存在,因爲最後一個項目從'allGroundShoes [0]'開始,它將是'allGroundShoes [11]'。 –

+0

@MXXenotype看起來好像是這樣,但'Math.random()'返回一個從0.0到小於1的浮點數(即0到1排除)。有關詳細信息,請參見[MDN頁面](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random)。 – GregL

回答

2

當您刪除找到的元素,你傳遞一個字符串常量,而不是變量名:

allGroundShoes.indexOf('randomAllGroundShoes'); 

由於沒有元素'randomAllGroundShoes',該元素將永遠不會被發現,並沒有元素將永遠從陣列中刪除。

它應該是:

allGroundShoes.indexOf(randomAllGroundShoes); 

但是,你正在做同樣的事情不止一次。根本不需要檢查allGroundShoes.indexOf()。您可以將隨機數存儲在變量中並再次參考。但是,即使這比你需要的還要多。只需撥打splice()讓你的價值:

randomAllGroundShoes = allGroundShoes.splice(
    Math.floor(Math.random() * allGroundShoes.length), 1)[0]; 
$('#'+randomAllGroundShoes).addClass('shoeNegitive'); 

這樣一來,您檢索你的價值,並從陣列中的一個步驟將其刪除 - 無需額外的查找。

jsfiddle.net/kRNTg

+0

正是我所說的:-)然而,我建議使用一個變量的索引,而不是這個冗長的單線(爲什麼使用'randomAllGroundShoes',我們可以將隨機選擇移動到jQuery選擇)... – Bergi

+0

@ gilly3非常感謝,PERFECT並解釋了....再次感謝! –

0

可能的話,可能會得到產生兩次相同的數字。

在這種情況下,如果這個數字已經被使用或者沒有被使用,你必須有一個檢查機制。

你可以做的是生成一個4個唯一的隨機數組的數組,並遍歷它來設置類。

var unqiue_arr = [] 
while(arr.length < 8){ 
    var randomnumber=Math.floor(Math.random()*12) 
    var found=false; 
    for(var i=0;i<3;i++){ 
    if(unqiue_arr[i]==randomnumber){found=true;break} 
    } 
    if(!found)unqiue_arr[unqiue_arr.length]=randomnumber; 
} 
+1

你會這麼想的,嘿?但'Math.random()'從不給出1.0的結果。有關詳細信息,請參見[此MDN鏈接](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/random)。 – GregL

+0

@GregL +1其實是的,在這種情況下應該是第二個原因。編輯我的答案 –

+0

他已經從數組中刪除元素(或者至少他正在嘗試)。這足以防止重複 - 只要它有效。這種嵌套循環方法效率很低。 – gilly3

0

我相信你的移除代碼是問題。嘗試改變最後兩條註釋掉線爲:

randomShoeID = allGroundShoes.indexOf(randomAllGroundShoes); 
if(randomShoeID != -1){ allGroundShoes = allGroundShoes.splice(randomShoeID, 1); } 
+1

完成此操作後,'allGroundShoes'將包含1個元素 - 剛剛找到的元素。 – gilly3

+0

@ gilly3請注意,先生。我忘記拼接返回已移除的數組元素。 – GregL

0

您與註釋掉行代碼具有當不會被刪除的項目,他們可能會被隨機選擇選擇兩次或更多的問題。

你註釋掉行有同樣的問題。你做了搜索allGroundShoes.indexOf('randomAllGroundShoes');這(是一個字符串,而不是變量)從未被包含在數組中。

使用此代碼來代替:

function randomizeShoes(){ 
    allGroundShoes = ['ground_black_1','ground_black_2','ground_brown_1','ground_brown_2','ground_clown_1','ground_clown_2','ground_disco_1','ground_disco_2','ground_moccasins_1','ground_moccasins_2','ground_red_1','ground_red_2']; 
    for (var i=0; i<4; i++){ 
     var randomShoeID = Math.floor(Math.random() * allGroundShoes.length); 
     var randomAllGroundShoes = allGroundShoes[randomShoeID]; 
     $('#'+randomAllGroundShoes+'').addClass('shoeNegitive'); 
     allGroundShoes.splice(randomShoeID, 1); 
    } 
} 

無需搜索你已經知道項目的指標,也沒有必要針對-1檢查如你所知的項目包含在你剛剛從中拉出來的數組。

相關問題