I need to get the previous and next elements in an unlimited cycle. For example,
The previous element of the first element in the array is the array last element Thenext element of the last element in the array is the array first element
What can be the most efficient way to do this. The only way I can think of is to check if the element is the first or last in the array in every round.
In fact, I hope to make the array a closed cycle somehow, rather than linear.
回答1:
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 blockif(/* 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];varnext=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;
var len = array.length;var current = array[i];var previous = array[(i+len-1)%len];varnext= 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%))
回答3:
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];}elseif(i <0){return theArray[(currentIndex + theArray.length + i)% theArray.length];}elseif(i >0){return theArray[(currentIndex + i)% theArray.length];}}// usage getAtIndex(-2)// you can even go crazy and it still works getAtIndex(500)