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

hs1ihplo  于 2023-02-11  发布在  Java
关注(0)|答案(5)|浏览(389)

在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

做这件事最有效的方法是什么?我能想到的唯一方法是在每一轮中检查元素是数组中的第一个还是最后一个。
事实上,我希望以某种方式使数组成为一个闭合循环,而不是线性的。

ie3xauqp

ie3xauqp1#

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

pxyaymoc

pxyaymoc2#

既然你在说“无限循环”我假设你的循环是这样的

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;

以及(更好的风格)循环中的“变量”

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;
wvmv3b1j

wvmv3b1j3#

要补充@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

mefy6pfw

mefy6pfw4#

为了让事情简单化。
数组中的下一个元素:

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

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

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

csbfibhn5#

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

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

有关**Reduce**的详细信息
编辑:在下面添加一些函数签名和更多信息

reduce(function (accumulator, currentValue) { /* … */ }, initialValue)
reduce(function (accumulator, currentValue, currentIndex) { /* … */ }, initialValue)
reduce(function (accumulator, currentValue, currentIndex, array) { /* … */ }, initialValue)

参数

  • accumulator-:上一次调用callbackFn得到的值。第一次调用时,如果指定,则为initialValue,否则为array[0]的值。
  • currentValue-:当前元素的值。第一次调用时,如果指定了initialValue,则返回array[0]的值,否则返回array[1]的值。
  • currentIndex-:数组中currentValue的索引位置。第一次调用时,如果指定了initialValue,则为0,否则为1
  • array-:调用了数组reduce()
  • initialValue * 可选 *
  • :第一次调用回调时将accumulator初始化为的值。如果指定了initialValue,则callbackFn从数组中的第一个值currentValue开始执行。如果 * 未 * 指定initialValue,则accumulator初始化为数组中的第一个值,并且callbackFn开始执行时数组中的第二个值为currentValue。在这种情况下,如果数组为空(因此没有第一个值作为accumulator返回),则会抛出错误。

返回值

在整个数组上运行"reducer"回调函数直至完成所产生的值。
参考:

相关问题