从数组中获取随机项,在for循环中,然后从数组中删除

时间:2012-11-21 00:02:17

标签: javascript jquery arrays random array-splice

我正在编写一个脚本,onload会将一个类添加到12个DIV的随机4中,然后从数组中删除DIV的ID。

我有一个包含所有12个DIV ID的阵列设置。

有时当我重新加载页面时,4 DIV'S有该课程,有时只有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); }
    }
}

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我相信你删除代码是个问题。尝试将最后两个注释掉的行更改为:

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

答案 3 :(得分: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,因为您知道该项目包含在您刚拔出的数组中。