2

情報 (「画像アドレス」) を保持するいくつかの配列 (この例では 8) があります。

var arr_1   = ["img1.jpg","img2.jpg","img3.jpg"];
var arr_2   = ["dis1.jpg","dis2.jpg","dis3.jpg","dis4.jpg","dis5.jpg","dis6.jpg"];
...
var arr_8   = ["rre.jpg","rre2.jpg","ree222.jpg","s4.jpg"];

次に、次のように定義されたサイズ 8 の整数配列を作成した各配列にカウンターが必要になるため、各配列の値をさまざまな関数に渡す必要があります。

var indexes = new Array(8);
var counter = 0;
for (counter=0; counter<8; counter++){ 
    indexes[counter]=0;
}

したがって、各エントリにはカウンターとなる数値が保持されます

indexes[0] represents the counter of array_1
indexes[1] represents the counter of array_2
...
indexes[7] represents the counter of array_8

その値を関数に渡すために、私は次のようなことをしています

myfunction("MyID"    , arr_1[indexes[0]++]);
myfunction("MyIDtr"  , arr_2[indexes[1]++]);
myfunction("MyIDfoo" , arr_3[indexes[2]++]);
...
myfunction("MyIDroot", arr_8[indexes[7]++]);

myfunction は id とカウンターを表す数値を受け取り、対応する配列にどの画像アドレスを取るべきかを伝えます。

さて、どうすれば次のようなことができますか

if(indexes[0] < arr_1.length){
     indexes[0]++
}else
     indexes[0] = 0;

私の関数の呼び出しの中に?

myfunction("MyID"    ,  logic   );

関数を作成する必要がありますか、それとも三項演算子を使用して実行できますか? もしそうなら、三項式はどのように見えるでしょうか?

4

4 に答える 4

1

配列ごとにイテレータオブジェクトを作成し、それらのオブジェクトにインデックスポインタの前進を処理させることができます。

function InfiniteArrayIterator(arr)
{
  this.arr = arr;
  this.i = 0;
}

InfiniteArrayIterator.prototype.getNext = function()
{
  var current = this.arr[this.i];

  // advance pointer    
  this.i = (this.i + 1) % this.arr.length;

  // and return current element      
  return current;
};

// your array definitions
var arr_1   = ["img1.jpg","img2.jpg","img3.jpg"];
var arr_2   = ["dis1.jpg","dis2.jpg","dis3.jpg","dis4.jpg","dis5.jpg"];

// define an iterator for each
var iterators = [
  new InfiniteArrayIterator(arr_1),
  new InfiniteArrayIterator(arr_2)
];

次に、これを関数に渡すだけです。

myfunction("MyID"    , iterators[0].getNext());
myfunction("MyIDtr"  , iterators[1].getNext());
// etc.

デモ

次のように配列を初期化することもできます。

var arr_1 = new InfiniteArrayIterator(["img1.jpg", "img2.jpg", "img3.jpg"]);

その後:

myfunction("MyID"    , arr_1.getNext());
于 2013-03-15T08:01:04.393 に答える
1

あなたの質問を完全に理解しているかどうかはわかりませんが、多分それはあなたを助けるでしょう

myfunction("MyID"    , arr_1[(indexes[0]++)%arr_1.length]);

% 演算子は Modulus (除算剰余) です。number が arr_length よりも大きくないことを確認するのに役立ちます。たとえば、次のように確認できます。

0%2 = 0
1%2 = 1
2%2 = 0
3%2 = 1
...
and so on

これは、その場合の小さな便利なトリックです

于 2013-03-15T07:22:57.423 に答える
1

index[i]引数として渡す代わりに、次を渡しiます。

myfunction("MyID",    arr_1, 0);
myfunction("MyIDtr",  arr_2, 1);
myfunction("MyIDfoo", arr_3, 2);
myfunction("MyIDbar", arr_4, 3);

index関数内で、配列にアクセスします。

function myfunction(id, arr, i){
   index[i] = (index[i]+1)%arr.length;
   arr[ index[i] ];
}

よりクリーンなバリアントは、配列とそのインデックスを object にまとめることです。

var images_1 = {
    urls: arr_1,
    index: 0
},
images_2 = {
    urls: arr_2,
    index: 0
}, ...

images引数を取るように関数を書きます:

function myfunction(id, images){
    images.index = (images.index + 1) % images.urls.length;

    images.urls[images.index] ...
}

最後に重要なことですが、実際に 8 つの配列があり_1、 , _2, _3... が実際にはインデックスである場合は、個別の変数を使用しないでください: 配列 (またはマッピング) を作成します:

var images = [];
//you can use integers as keys
images[0] = { urls: [...], index: 0 };
images[1] = { urls: [...], index: 0 };

//or names which have some other meaning in your code
images["MyID"]    = { ... }
images["MyIDtr"]  = { ... }
images["MyIDfoo"] = { ... }

構造をループし、構造にアクセスし ( images[this.id])、必要に応じて短縮/拡張する方が簡単です。

于 2013-03-15T07:37:25.903 に答える
0

三項演算子を使用する

例えば。

indexes[0] = (indexes[0]<arr_1.length)?indexes[0]+1:0;

于 2013-03-15T07:21:10.110 に答える