homeホームHTMLに役立つヒントJAVAスクリプトコレクション > 配列から重複しないようにランダムに取り出す

配列から重複しないようにランダムに取り出す



 配列を用意して、その中から重複がないようにランダムに要素を取り出しなさいと。perlなら簡単にできるが、JAVAscriptでは思わぬ伏兵がいた。

 重複を避けるのは実は簡単だ。配列の中からランダムに要素を取り出したら、今取り出した要素を元の配列から削除してしまえばいい。「111,222,333,444」という配列があって、「222」を取り出したら「111,333,444」という配列に作り変えて、次はこの配列を元にしてランダムに要素を取り出すのである。こうすれば重複はない。

 配列の中から任意の要素を削除して、一つ短い配列に作り直すには、spliceという命令を使うのが簡単である。perlな人なのですぐにそれを考えた。JAVAscriptにも同じ命令があるじゃん、楽勝と思ったら、この命令、IE5.5以降でないとサポートしていないことが判明。Macintosh版のIEはOS 9が5.1x、OS X版が5.2xで最終なので、この命令が使えないのだ。

 それだけでなく、pop、pushといった配列をいじる命令が軒並み5.5以降(;_;)

 で、しかたないので以下のような面倒なことをして一つ要素の少ない配列に作り直している。

<script language="javascript" type="text/javascript">
<!--
function splice_modoki(){
//配列を用意
var flashName = new Array("flash_01.swf","flash_02.swf","flash_03.swf","flash_04.swf","flash_05.swf","flash_06.swf","flash_07.swf","flash_08.swf","flash_09.swf","flash_10.swf");
kaisuu = 10 ; //取り出す個数。配列数より多くしてはだめ。kaisuu = flashName.lengthにすると配列の数だけ取り出してくれて安全。ここではあえてマニュアル指定。
aaa= ""; //選んだ順に取っておく変数を用意

for(i=0;i<kaisuu;i++){

document.write(i + "元の配列" + flashName + "<br>"); //■動作がわかりやすいように元配列を表示

thisFlash = flashName[Math.floor(Math.random()*flashName.length)];//ランダムに生成

//元配列flashNameを、生成されたthisFlashのない短い配列に作り直す。
//splice/pop/pushサポートされるのはIE5.5以降なので面倒なことをしている。
newFlashName = flashName + ""; //空文字を追加することで文字列に変換して代入
mypatt = new RegExp(thisFlash,"g"); //マッチパターンのセット
newFlashName = newFlashName.replace(mypatt,""); //置換する
newFlashName = newFlashName.replace(/,,/g,","); //,,を,に置換する
newFlashName = newFlashName.replace(/^,/,""); //行頭の,を削除
newFlashName = newFlashName.replace(/,$/,""); //行末の,を削除
flashName = newFlashName.split(","); // ,で分解して配列に戻す。同時に元の配列とすり替え

aaa = aaa + thisFlash + "<br>"; //生成された配列を追加
}
document.write(aaa + "<br>"); //できあがったランダムな順番に表示。
}

//-->
</script>

 いったん文字列に変換して、文字列として置換してから配列に戻すという手間ヒマをかけている。同様の手法でpopもpushも実現可能である。

 しかし、この方法では、最初に用意した配列が、例えば「1,2,3,........11,12,13,14」というようなものであると、「2」が選ばれた際に「2」「12」「20,21,22,23....」の「2」部分も削除対象になって誤動作を起こす。そういう場合は「001,002,003......」のように、必ずユニークな内容の配列にする必要がある。


homeホームHTMLに役立つヒントJAVAスクリプトコレクション > 配列から重複しないようにランダムに取り出す