代码之家  ›  专栏  ›  技术社区  ›  edgarmtze

传递给函数:数组内递增的整数或使用三元运算符或自定义函数设置重置数组

  •  2
  • edgarmtze  · 技术社区  · 13 年前

    我有几个数组(在本例中为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 回复  |  直到 13 年前
        1
  •  1
  •   Elephant    13 年前

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

    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
    

    对于这种情况,这是一个有用的小技巧

        2
  •  1
  •   LeGEC    13 年前

    而不是通过 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] )并在需要时缩短/延长。

        3
  •  1
  •   JaÍ¢ck    13 年前

    您可以为每个数组创建迭代器对象,并让这些对象处理索引指针的前进:

    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.
    

    Demo

    您甚至可以这样初始化您的数组:

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

    然后:

    myfunction("MyID"    , arr_1.getNext());
    
        4
  •  0
  •   Black Maggie    13 年前

    使用三元运算符

    如。

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