2013-01-17 57 views
14

Trong một vòng lặp mảng đơn giản của javacript nhưLàm thế nào để có được các phần tử trước và sau của một vòng lặp mảng trong JavaScript?

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

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

} 

tôi cần phải nhận được previousnext yếu tố trong một chu kỳ không hạn chế. Ví dụ:

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 

Cách hiệu quả nhất để thực hiện việc này là gì. Cách duy nhất tôi có thể nghĩ đến là kiểm tra xem phần tử là phần tử đầu tiên hay cuối cùng trong mảng trong mỗi vòng.

Thực tế, tôi hy vọng làm cho mảng trở thành một chu kỳ khép kín bằng cách nào đó, thay vì tuyến tính.

+0

"làm cho mảng một chu kỳ khép kín "- điều đó là không thể. Bạn có thể có thể thực hiện một số loại vòng đệm như cấu trúc bằng cách sử dụng các đối tượng, nhưng mảng luôn tuyến tính. –

+0

@ lethal-guitar Tôi biết nó không phải là bản chất của một mảng, tôi đã nói theo nghĩa đen. – Googlebot

Trả lời

8

khi bạn đang nói về "chu kỳ không giới hạn" Tôi giả sử vòng lặp của bạn giống như vậy

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

Các cách hiệu quả nhất để đạt được mục tiêu của bạn là ngây thơ một: kiểm tra

var previous=array[i==0?array.length-1:i-1]; 
    var current=array[i]; 
    var next=array[i==array.length-1?0:i+1]; 

rõ ràng bộ nhớ cache chiều dài của mảng trong một biến

var l = array.length; 

và (phong cách tốt hơn) "vars" ra khỏi chu kỳ

var previuos, 
    current, 
    next; 

Lưu ý rằng nếu bạn đang truy cập vào mảng chỉ đọc sẽ có một cách nhanh hơn (nhưng hơi lạ):

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

Sử dụng modulus:

var len = array.length; 

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

Lưu ý +len khi nhận được trước: Lý do chúng ta cần điều này là để tránh chỉ số tiêu cực, do các công trình cách modulus (rất không may, -x%-(x%))

1

bạn cần giảm; một chức năng ngọt ngào được xây dựng để có được giá trị trước đó và tiếp theo của mảng

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

Để làm rõ, 'previousValue' thực sự là một' bộ tích lũy', vì nó không phải là giá trị mảng trước đó, nhưng những gì được trả về từ lời gọi lại gọi lại trước đó. – evolutionxbox

2

Để thêm vào @Denys câu trả lời - đây là cách bạn có thể tạo một hàm reuseable

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

Các vấn đề liên quan