Как получить предыдущий и следующий элементы цикла массива в JavaScript? - программирование
Подтвердить что ты не робот

Как получить предыдущий и следующий элементы цикла массива в JavaScript?

В простом цикле массива Javacript как

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

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

}

Мне нужно получить элементы previous и next в неограниченном цикле. Например,

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

Что может быть самым эффективным способом сделать это. Единственный способ, которым я могу думать, это проверить, является ли элемент первым или последним в массиве в каждом раунде.

На самом деле, я надеюсь сделать массив замкнутым циклом как-то, а не линейным.

4b9b3361

Ответ 1

как вы говорите о "неограниченном цикле", я предполагаю, что ваш цикл похож на этот

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;

Ответ 2

Используйте модуль:

var len = array.length;

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

Обратите внимание на +len при получении предыдущего: причина, по которой мы нуждаемся в этом, заключается в том, чтобы избежать отрицательных индексов, из-за того, как работает модуль (к сожалению, -x% - -(x%))

Ответ 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)

Демо-версия jsfiddle

Ответ 4

вам нужно уменьшить; встроенная функция слайдов для получения предыдущих и следующих значений массива

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