2012-11-21 24 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检查如你所知的项目包含在你刚刚从中拉出来的数组。

相关问题