広告

posted by fanblog
「ここにブログの名前を入れます」は更新を終了しました。記事はすべて新ブログ「Big Bang」に移転済みです。記事のタイトルをクリックすると新ブログの該当記事に移動します。そちらでお楽しみください。

重複のないランダム表示

前回の「ランダム表示」はとにかくランダムに表示することだけを考えたソースです。

このページの右上の広告のように、ひとつだけ選んで表示する時は、あれで問題ありません。
ただ、そのままだと、この記事下の楽天のように複数表示させたいときには重複する可能性が
あります。

その重複を避けたランダム表示の方法です。

重複を避けるには、既に選ばれたものを配列から削除すればいいです。
配列の中になければ、もう選ばれません。


var affiliates=['affiliate1','affiliate2','affiliate3'];
var count=3;
var buff='';

for(var i=0;i<count;i++){
	var n=(new Date).getTime()%affiliates.length;
	buff+=affiliates[n];
	affiliates.splice(n,1);
}

document.write(buff);

countは表示させる広告数です。
表示させるアフィリエイトのソースを、count回だけbuffに書き足していきます。
(countの方がaffiliatesの要素数より大きい場合のエラー処理はしていません)

buffを使わないで、for文の中で毎回document.writeしても表示されますが、それよりも、
いちどHTMLを全部buffに書きためて、それをまとめてwriteした方が圧倒的に速いです。

affiliates.splice(n,1);でaffiliates[n]の要素を削除して、その後の要素を前にずらします。

arrayObj.splice(elemNo, len [, str1 [, str2 [, str3]]]);
配列の指定された要素を置換します。

第一引数:置換を開始する要素番号
第二引数:置換する要素数
第三引数:置換させる値(省略すると削除される)
戻り値:置換される前の値(配列)

戻り値は置換される前の配列です。arrayObjそのものが置換されます。

これは非常にややこしい関数で、説明が大変です。というか、私も調べながら使いました。

spliceに関して、いちばんわかりやすくて詳しいと思うのは、
JavaScript リファレンス 配列オブジェクトだと思います。とても参考になりました。

追記:上に紹介したブログにお礼のコメントを書いたんですが送信エラーで送れませんでした。
トラックバックも届いたかどうか分かりませんが、作者の方有難うございました。

新ブログ「Big Bang」で続きを読む