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
これを行う最も効率的な方法は何ですか。私が考えることができる唯一の方法は、要素がすべてのラウンドで配列の最初か最後かをチェックすることです。
実際、アレイを線形ではなく、何らかの形で閉じたサイクルにしたいと思っています。
あなたは「無制限のサイクル」について話しているので、あなたのループはそのようなものだと思います
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;
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%)
)
@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)
減らす必要があります。配列の前の値と次の値を取得するための組み込みの甘い関数
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) {
return previousValue + currentValue;
});