0

onload が 12 個の DIV のうちランダムな 4 個にクラスを追加し、配列から DIV の ID を削除するスクリプトを作成しています。

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); }
    }
}
4

4 に答える 4

2

見つかった要素を削除すると、変数名の代わりに文字列リテラルが渡されます。

allGroundShoes.indexOf('randomAllGroundShoes');

elementが'randomAllGroundShoes'ないため、要素が見つからず、配列から要素が削除されることはありません。

そのはず:

allGroundShoes.indexOf(randomAllGroundShoes);

しかし、あなたは同じことを何度もしています。確認する必要はまったくありませんallGroundShoes.indexOf()。乱数を変数に格納して、再度参照することができます。しかし、それでも必要以上です。呼び出すだけsplice()で値を取得できます。

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

このようにして、値を取得して配列から削除するのを 1 ステップで行うことができます。追加のルックアップは必要ありません。

jsfiddle.net/kRNTg

于 2012-11-21T00:36:45.833 に答える
0

コメントアウトされた行を含むコードには、アイテムが削除されていない場合、ランダム選択によって 2 回以上選択される可能性があるという問題があります。

コメントアウトされた行にも同じ問題がありました。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既に知っているアイテムのインデックスを検索する必要はありません。また、そのアイテムを取り出したばかりの配列にアイテムが含まれていることがわかっているため、チェックする必要もありません。

于 2012-11-21T00:35:36.700 に答える
0

おそらく、同じ数が 2 回生成されている可能性があります。

その場合、その番号がすでに使用されているかどうかを確認するメカニズムが必要です。

あなたができることは、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;
}
于 2012-11-21T00:05:10.050 に答える
0

あなたの削除コードが問題だと思います。コメントアウトされた最後の 2 行を次のように変更してみてください。

randomShoeID = allGroundShoes.indexOf(randomAllGroundShoes);
if(randomShoeID != -1){ allGroundShoes = allGroundShoes.splice(randomShoeID, 1); }
于 2012-11-21T00:07:41.113 に答える