In a simple array loop of Javacript as
for (var i=0; i
you need reduce; a built sweet function to get previous and next values of array
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) {
return previousValue + currentValue;
});
To add to @Denys answer - this is how you can create a reuseable function
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
Use modulus :
var len = array.length;
var current = array[i];
var previous = array[(i+len-1)%len];
var next = array[(i+1)%len];
Note the +len
when getting the previous: the reason we need this is to avoid negative indexes, due to the way modulus works (very unfortunately, -x%
is -(x%)
)
as you're talking about "unlimited cycle" I assume your loop is something like that
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;
}
The most efficient way to achieve your goal is the naive one: checking
var previous=array[i==0?array.length-1:i-1];
var current=array[i];
var next=array[i==array.length-1?0:i+1];
obviously cache the length of the array in a variable
var l = array.length;
and (better style) the "vars" out of the cycle
var previuos,
current,
next;
Note that if you are accessing the array read only there would be a faster (but somewhat strange) way:
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;