Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中获取数组循环的上一个和下一个元素?_Javascript_Arrays_Loops - Fatal编程技术网

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

如何在JavaScript中获取数组循环的上一个和下一个元素?,javascript,arrays,loops,Javascript,Arrays,Loops,在Javascript的简单数组循环中 for (var i=0; i<array.length; i++) { var previous=array[i-1]; var current=array[i]; var next=array[i+1]; } 最有效的方法是什么。我能想到的唯一方法是检查元素在每一轮中是数组中的第一个还是最后一个 事实上,我希望以某种方式使阵列成为一个闭合的循环,而不是线性的。使用: 请注意获取上一个时的+len:我们需要这样做的原因是为了避免负索引,因为模

在Javascript的简单数组循环中

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

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

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


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

使用:

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

当您谈论“无限循环”时,我假设您的循环是这样的

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 l = array.length;
和(更好的风格)循环之外的“VAR”

var previuos,
    current,
    next;

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

l=array.length;
数组[-1]=数组[l-1];//这是合法的
数组[l]=数组[0];
对于(i=0;i
您需要减少;一个内置的sweet函数,用于获取数组的上一个值和下一个值

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

有关要添加到@Denys answer中的的更多信息,请参见-这是创建可重用函数的方法

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)
var theArray=[0,1,2,3,4,5];
var currentIndex=0;
函数getAtIndex(i){
如果(i==0){
返回数组[当前索引];
}else if(i<0){
返回数组[(当前索引+数组长度+i)%数组长度];
}如果(i>0),则为else{
返回数组[(currentIndex+i)%theArray.length];
}
}
//用法
getAtIndex(-2)
//你甚至可以发疯,但它仍然有效
getAtIndex(500)

让它变得简单

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

 currentIndex= (currentIndex+1)%array.length;
currentIndex= (currentIndex+array.length-1)%array.length;
对于数组中的上一个元素:

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

“让阵列成为一个封闭的循环”-这是不可能的。您可以使用对象实现某种类似环形缓冲区的结构,但数组总是线性的。我知道这不是数组的本质,我直截了当地说。为了澄清,
previousValue
实际上是一个
累加器,因为它不是先前的数组值,但是之前的回调调用返回了什么。
 currentIndex= (currentIndex+1)%array.length;
currentIndex= (currentIndex+array.length-1)%array.length;