web-dev-qa-db-ja.com

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

これを行う最も効率的な方法は何ですか。私が考えることができる唯一の方法は、要素がすべてのラウンドで配列の最初か最後かをチェックすることです。

実際、アレイを線形ではなく、何らかの形で閉じたサイクルにしたいと思っています。

23
Googlebot

あなたは「無制限のサイクル」について話しているので、あなたのループはそのようなものだと思います

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

最も効率的な方法目標を達成するのは単純です: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];

明らかに配列の長さを変数にキャッシュします

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;
10
Paolo

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

56
Denys Séguret

@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

3
sidonaldson

減らす必要があります。配列の前の値と次の値を取得するための組み込みの甘い関数

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