How to get the previous and next elements of an array loop in JavaScript?

前端 未结 4 1240
攒了一身酷
攒了一身酷 2020-12-23 12:09

In a simple array loop of Javacript as

for (var i=0; i

        
相关标签:
4条回答
  • 2020-12-23 12:29

    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;
    });
    
    0 讨论(0)
  • 2020-12-23 12:33

    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

    0 讨论(0)
  • 2020-12-23 12:38

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

    0 讨论(0)
  • 2020-12-23 12:40

    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;
    
    0 讨论(0)
提交回复
热议问题