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

Posted

技术标签:

【中文标题】如何在 JavaScript 中获取数组循环的前一个和下一个元素?【英文标题】:How to get the previous and next elements of an array loop in JavaScript? 【发布时间】:2013-01-01 12:51:32 【问题描述】:

在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

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

其实我希望能以某种方式让数组成为一个闭环,而不是线性的。

【问题讨论】:

“使数组成为闭合循环”——这是不可能的。您也许可以使用对象实现某种类似于环形缓冲区的结构,但数组始终是线性的。 @lethal-guitar 我知道这不是数组的本质,我从字面上说。 【参考方案1】:

使用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%)

【讨论】:

【参考方案2】:

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

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;

和(更好的风格)循环中的“vars”

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;

【讨论】:

【参考方案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

【讨论】:

【参考方案4】:

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

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

有关Reduce

的更多信息

【讨论】:

澄清一下,previousValue 实际上是一个accumulator,因为它不是之前的数组值,而是之前回调调用返回的值。【参考方案5】:

为了简单。

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

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

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

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

【讨论】:

以上是关于如何在 JavaScript 中获取数组循环的前一个和下一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho - 文件名中的前一周

一JavaScript获取当前月份的前12个月,获取最近的12个月二js实现获取当前月份前的12个月份,格式化后放在一个数组里

JavaScript 冒泡排序法

在javascript中显示数组中的前一个元素

如何求字符串next数组值

在 Java 中循环遍历数组的前 20 个元素