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

不确定我是否完全理解你的问题,但也许这对你有帮助

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

% 运算符是模数(除法余数)。它有助于确保数字不会大于 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] ];
}

一个更简洁的变体是将数组及其索引打包到一个对象中:

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 回答
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 回答
0

使用三元运算符

例如。

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

于 2013-03-15T07:21:10.110 回答