【问题标题】:pass to function: incremented integer inside array or set reset array with ternary operator or a custom function传递给函数:数组内的递增整数或使用三元运算符或自定义函数设置重置数组
【发布时间】:2013-03-03 20:00:28
【问题描述】:

我有几个数组(在本例中为 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   );

是否需要创建一个函数或者可以使用三元运算符来完成?如果是这样,三元表达式会是什么样子?

【问题讨论】:

    标签: javascript jquery ternary-operator


    【解决方案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
    

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

    【讨论】:

    • 对不起,如果我没有说清楚,我想在每次调用我的函数时传递一个在indexes[0] 中保存的递增整数,然后如果该索引中的值等于array_1 的长度,然后重置indexes[0] 中的值,这样我就可以继续迭代...
    • 为什么是 %,当等于 arr_1.length 时会检查条件吗,能不能详细解释一下?
    • 好吧,我以前从来没有像这样使用过模运算符,但这是一个很棒的技巧,谢谢
    【解决方案2】:

    不要将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】:

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

      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】:

        使用三元运算符

        例如。

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

        【讨论】:

        • 所以我会打电话给myfunction("MyID", indexes[0]&lt;arr_1.length)?indexes[0]+1:0 ); ?
        • 我认为@Elephant 给出了更好的答案
        • 请在google上查看模数运算符(%)对它的操作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多