33

Javacript の単純な配列ループで

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

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

}

無制限のサイクルでpreviousand要素を取得する必要があります。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

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

実際、線形ではなく、何らかの方法で配列を閉じたサイクルにしたいと考えています。

4

5 に答える 5

83

モジュラスを使用:

var len = array.length;

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

前のものを取得するときは注意してください+len。これが必要な理由は、モジュラスの動作方法のために負のインデックスを回避するためです(非常に-x%残念なことに-(x%)

于 2013-01-17T21:18:41.957 に答える
16

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

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;
于 2013-01-17T21:22:58.013 に答える
4

削減する必要があります。配列の前の値と次の値を取得するために構築された甘い関数

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

Reduceの詳細については

于 2016-05-31T07:41:45.687 に答える