如何在循环整个数组的同时从不同索引开始循环?

17

假设我有一个由5个字符串组成的数组。如何从索引3开始循环并最终到达索引2?让我举个例子。

var myArry = ["cool", "gnarly", "rad", "farout", "awesome"];

想要从索引3("farout")开始循环直到数组的末尾("awesome"),然后继续从索引0循环到索引2。 基本上从某个点(而不是索引0)开始一个数组,并仍然遍历数组中的每个元素。


是的,我知道,我需要一个For循环,而且我知道如何使用For循环,只是不知道如何按照我所问的问题设置它。 - dragonore
我可以问一下你为什么要这样做吗?如果你要遍历数组中的每个元素,那又有什么关系呢? - Davie Brown
1
嗯,我正在闲暇时开发一个二十一点游戏。为了能够替换重复出现的卡片,我需要这样做。我将重复的值存储在数组中,然后需要循环遍历它们。由于该数组是动态的,有时我需要从索引3、4、1或任何其他位置开始。感谢您的询问。 - dragonore
3个回答

26

一种方法是像平常一样使用索引循环数组,然后使用模运算符与偏移量一起使用,以获取指向数组中正确位置的指针:

var myArry = ["cool", "gnarly", "rad", "farout", "awesome"];
var offset = 3;
for( var i=0; i < myArry.length; i++) {
    var pointer = (i + offset) % myArry.length;
    console.log(myArry[pointer]);
}

所以你的循环是标准循环,遍历每个元素。你取当前位置加上偏移量,并对数组大小取余数。直到你遍历到数组末尾,这将与i + offset相同。当你到达数组末尾时,余数将为零,从那里开始继续。

这里有一个JSFiddle示例


1
偏移量应为 3,用于 OP 的问题。 - k0pernikus
1
谢谢,运行得很好。我知道可以在if语句中使用一系列||来实现这个,但那看起来不太好,也无法模块化。你的解决方案非常好。在Google上找不到任何相关信息。谢谢。 - dragonore
这正是我需要的算法,可以完美地动画堆叠的 UI 面板,可以在水平方向上进行更改,谢谢! - eballeste

6

以下是您需要的内容:

var start = 3;
for(var z=0;z<myArry.length;++z) {
  var idx = (z+start) % myArry.length;
  console.log(myArry[idx]);
}

1
甚至没有想到使用模数。运行良好。 - dragonore

2
var startAt = 3;
for(var index = 0;index<myArry.length;index++){
  console.log(myArry[startAt]);
  if(startAt==myArry.length-1){
        startAt = -1;
  } 
  startAt++;
}

jsbench 显示,被接受的解决方案比这个答案慢了 73.09%。 - yeah22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接