如何在JavaScript中获取数组循环的上一个和下一个元素?

时间:2013-01-17 21:16:06

标签: javascript arrays loops

在Javacript的简单数组循环中

for (var i=0; i<array.length; i++) {

var previous=array[i-1];
var current=array[i];
var next=array[i+1];

}

我需要在无限循环中获取previousnext元素。例如,

The previous element of the first element in the array is the array last element
The next element of the last element in the array is the array first element

最有效的方法是什么?我能想到的唯一方法是在每一轮中检查元素是否是数组中的第一个或最后一个。

事实上,我希望以某种方式使数组成为一个闭合循环,而不是线性。

5 个答案:

答案 0 :(得分:53)

使用modulus

var len = array.length;

var current = array[i];
var previous = array[(i+len-1)%len];
var next = array[(i+1)%len];

请注意+len获取上一个:我们需要这样做的原因是为了避免负面索引,因为模数的工作方式(非常不幸的是,-x%-(x%)

答案 1 :(得分:10)

因为你正在谈论&#34;无限循环&#34;我假设你的循环是那样的

var i = 0,
    l = array.length;

while( true ) // keep looping
{
    if(i >= l) i = 0;

    // the loop block

    if(/* something to cause the loop to end */) break; // <-- this let execution exit the loop immediately

    i+=1;
}

实现目标的最有效方式是天真的:检查

    var previous=array[i==0?array.length-1:i-1];
    var current=array[i];
    var next=array[i==array.length-1?0:i+1];

显然将数组的长度缓存在变量

var l = array.length;

和(更好的风格)&#34; vars&#34;离开周期

var previuos,
    current,
    next;

请注意,如果您正在访问数组只读,则会有更快(但有点奇怪)的方式:

l = array.length;
array[-1] = array[l-1]; // this is legal
array[l] = array[0];

for(i = 0; i < l; i++)
{
    previous = array[i-1];
    current = array[i];
    next = array[i+1];
}

// restore the array

array.pop(); 
array[-1] = null;

答案 2 :(得分:3)

要添加到@Denys答案 - 这是您可以创建可重复使用的功能的方法

var theArray = [0, 1, 2, 3, 4, 5];
var currentIndex = 0;

function getAtIndex(i) {
    if (i === 0) {
        return theArray[currentIndex];
    } else if (i < 0) {
        return theArray[(currentIndex + theArray.length + i) % theArray.length];
    } else if (i > 0) {
        return theArray[(currentIndex + i) % theArray.length];
    }
}

// usage
getAtIndex(-2)

// you can even go crazy and it still works
getAtIndex(500)

Demo jsfiddle

答案 3 :(得分:2)

你需要减少;一个内置的甜函数,用于获取数组的上一个和下一个值

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) {
  return previousValue + currentValue;
});

答案 4 :(得分:0)

为了简单。

对于数组中的下一个元素:

 currentIndex= (currentIndex+1)%array.length;

对于数组中的前一个元素:

currentIndex= (currentIndex+array.length-1)%array.length;