2012-05-13 40 views
9

Tôi có một mảng thưa thớt (chỉ số không liên tục) như thế này:Javascript lặp qua mảng thưa thớt

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

tôi chỉ đơn giản muốn lặp qua từng hạng mục, làm một số công cụ, và có khả năng phá vỡ dưới điều kiện nhất định.

Tôi khá mới với Javascript và tôi không tìm được cách thích hợp để làm điều đó. Dưới đây là những gì tôi đã thử:

  1. Được xây dựng trong "for..in". Có vẻ như đây là not the correct way to iterate through an array

  2. forEach từ ECMASCRIPT5. Điều này lặp đi lặp lại một cách chính xác, nhưng tôi không thể thoát khỏi vòng lặp.

  3. _.each() từ Underscore.js. Cùng một kết quả như # 2.

  4. $.each() từ JQuery. Với cái này tôi có thể phá vỡ bằng cách trả về false, nhưng nó sẽ không lặp lại chính xác. Đối với ví dụ trên, thay vì lặp lại ở 0, 5, 10, 15, nó sẽ lặp lại ở 0,1,2,3,4,5,6 ... mà rõ ràng không phải là những gì tôi mong đợi.

Vì vậy, câu hỏi của tôi là: Có một cách dễ dàng để lặp một mảng thưa thớt với khả năng để phá vỡ trong vòng lặp trong Javascript hoặc nó sẽ là tốt hơn để sử dụng một cấu trúc dữ liệu như một Hashtable? Nếu vậy, bất kỳ recommandation?

Cảm ơn!

+1

nếu bạn xem qua liên kết mà bạn đã cung cấp ở điểm # 1, vòng lặp for..in tích hợp LÀ cách lặp qua thuộc tính đối tượng, đó là những gì bạn có – anson

+0

Từ những gì tôi hiểu từ liên kết là một vấn đề có thể xảy ra nếu một thư viện thêm một thành viên vào Array.prototype. Sau đó, thành viên sẽ là một phần của vòng lặp "for..in". – Absolom

+0

Ah ok, ví dụ của tôi không hợp lệ vì tôi đang sử dụng một Object và không phải là một Array. Vì vậy, bình luận của bạn là chính xác. – Absolom

Trả lời

6

Có gì sai với cú pháp for...in? Bạn có một đối tượng để cú pháp for...in là hoàn toàn hợp lệ để sử dụng:

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

for (var key in testArray) { 
    var value = testArray[key]; 

    if (...) { 
    break; 
    } 
} 
+0

Cảm ơn câu trả lời. Nhưng nếu tôi muốn sử dụng một Mảng thực thay vì một chiếc Object? Những gì bạn sẽ sử dụng sau đó? – Absolom

+0

@Absolom JS Mảng kế thừa từ Object, do đó, điều này sẽ vẫn hoạt động tốt. – mikemaccana

+3

Có phải cho lệnh bảo đảm không? –

1

for..in không phải là điều tồi tệ nhất khi bạn đang làm việc trên một băm đối tượng. Đó là cần phải tránh để sử dụng với mảng ([]), nhưng nó phải là ok đây:

var val; 
for (index in testArray) { 
    if (index == 10) { 
    break; 
    } else { 
    val = testArray[index]; 
    } 
} 
2

Điều đầu tiên bạn phải hôn-bye-bye là "mảng". Không có Array thực trong ECMAscript (quên mảng đánh máy và thủ thuật nhị phân).

Vì vậy, những gì bạn đã có ở đó là đồng bằng Object. Để lặp lại điều đó, tôi khuyên bạn nên sử dụng .forEach nếu bạn thấy thú vị với ES5. Nếu bạn cần phải đầu phá vỡ lặp đó, bạn có thể muốn sử dụng phương pháp ES5 như .some() hoặc .every(), như:

Object.keys(testArray).some(function(key) { 
    if(+key < 15) {    
     return true; 
    } 

    console.log(key, testArray[key]); 
}); 

này sẽ interrup lặp khi một phím được gặp mà giá trị số không thấp hơn 15, bởi trở về true.

0

Những gì bạn có không phải là một mảng, nó chỉ là một đối tượng.

Bạn có thể thử nghiệm bằng cách:

Array.isArray(testArray) 

Đối với những gì có giá trị, không hoạt Javascript có mảng đó là cho là thưa thớt.Điều này xảy ra khi bạn sử dụng toán tử delete để xóa phần tử hoặc thay đổi thuộc tính độ dài thành lớn hơn.

Để trả lời câu hỏi của bạn, để lặp qua một đối tượng, cách tốt nhất là Object.keys(obj).forEach().

var o = {"a":3, "b":4}; 

Object.keys(o).forEach(
    function (key) { 
     var val = o[key]; 
     console.log("Key:" + key); 
     console.log("Value:" + val); 
    } 
); 

Vấn đề có thể với for (var p in o) {…} là nó cũng sẽ lặp qua bất kỳ thuộc tính đếm được trong các phụ huynh (có nghĩa là, chuỗi nguyên mẫu). Thông thường nó sẽ không xảy ra mặc dù, nếu bạn xác định bạn đối tượng bằng biểu thức chữ var obj = {...}, theo mặc định, cha mẹ của nó là Object.prototype, và nó không có bất kỳ thuộc tính đếm được nào.

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