2014-12-22 14 views
5

Tôi có một mảng thưa thớt có nội dung không được bảo đảm để được chèn vào thứ tự chỉ mục nhưng cần được lặp lại thông qua thứ tự chỉ mục. Để lặp qua một mảng thưa thớt, tôi hiểu rằng bạn cần sử dụng câu lệnh for..in.Tôi nên lặp lại như thế nào trên một mảng thưa thớt trong thứ tự chỉ mục?

Tuy nhiên, theo this article:

Không có gì bảo đảm rằng for ... in sẽ trở lại các chỉ số trong bất kỳ thứ tự cụ thể

Nhưng stackoverflow questions like this gợi ý rằng trong khi đối tượng đơn đặt hàng bất động sản không phải là được đảm bảo, các đơn hàng mảng là:

các thuộc tính đặt hàng trong các đối tượng không được bảo đảm bằng JavaScript, bạn cần sử dụng Arra y.

I tested this trong các phiên bản mới nhất của Chrome, Firefox và IE.

<ol id="items"></ol> 
var list = []; 

function addItem(index) { 
    list[index] = { idx : index }; 
} 

var insertOrder = [ 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 ]; 

for (var i = 0; i < 15; i++) { 
    addItem(insertOrder[i]); 
} 

for(var item in list) { 
    $("#items").append("<li>" + list[item].idx + "</li>"); 
} 

Tất cả xuất hiện để tôn vinh thứ tự chỉ số vì vậy tôi có thể tin tưởng này luôn luôn là trường hợp? Nếu không, làm thế nào để tốt nhất có được chúng trong thứ tự chỉ mục?

+0

tôi sẽ không mất mà bạn trích dẫn như là một dấu hiệu cho thấy 'for..in' được bảo đảm với mảng. (Tôi không nói rằng nó không phải là, nhưng dòng đó không thực sự nói rằng nó là). Ngoài ra, có [lý do rất tốt] (http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea) để tránh sử dụng ' for..in' với mảng, ngay cả khi đặt hàng hoạt động tốt. – JLRishe

+0

Bạn có thể thấy sự khác biệt ở đây: http://jsfiddle.net/abhitalks/rfe33uxf/ – Abhitalks

+0

c.f. [Câu trả lời này] (http://stackoverflow.com/a/4261096/1945651): _ "Ngoài ra, thứ tự lặp lại không được đảm bảo bởi spec., có nghĩa là nếu bạn muốn" lặp "một đối tượng mảng, với câu lệnh này bạn không thể chắc chắn rằng các thuộc tính (mảng chỉ mục) sẽ được truy cập theo thứ tự số. "_ – JLRishe

Trả lời

10

MDN có câu trả lời cho câu hỏi ban đầu của bạn:

Lưu ý: for..in không nên được sử dụng để lặp qua một mảng nơi để chỉ số rất quan trọng.

Chỉ mục mảng chỉ là các thuộc tính có thể đếm được với tên nguyên và nếu không giống với thuộc tính đối tượng chung. Không có gì đảm bảo rằng đối với ... in sẽ trả về các chỉ mục theo bất kỳ thứ tự cụ thể nào và nó sẽ trả về tất cả các thuộc tính đếm được, kể cả các thuộc tính không có số nguyên và những cái được kế thừa.

Bạn không phải sử dụng for..in để lặp qua một mảng thưa thớt và bạn nên definitely avoid doing so nếu có thể.

Bạn có thể chỉ cần sử dụng .forEach:

list.forEach(function (el) { // add a second parameter if you need the indices 
    $("#items").append($("<li>").text(el.idx)); 
}); 

forEachis defined để lặp để chỉ mục và chỉ bao gồm các yếu tố có mặt trong mảng:

forEach thực hiện gọi lại cung cấp một lần cho mỗi phần tử có mặt trong mảng theo thứ tự tăng dần. Nó không được viện dẫn cho các chỉ mục đã bị xóa hoặc elided. Tuy nhiên, nó được thực hiện cho các phần tử có mặt và có giá trị không xác định.


Nếu bạn đang nhắm mục tiêu môi trường không hỗ trợ forEach, bạn có thể sử dụng sau đây, hoặc shim cung cấp trên trang đó MDN:

for (var i = 0; i < list.length; i += 1) { 
    if (i in list) { 
     $("#items").append($("<li>").text(list[i].idx)); 
    } 
} 
+0

Cảm ơn. Và [bài đăng này] (http://stackoverflow.com/questions/13600922/does-javascript-array-foreach-traverse-elements-in-ascending-order) cho tôi biết rằng ForEach được đảm bảo. –

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