2012-03-23 22 views
5

Tôi có một dịch vụ web trả về một mảng dữ liệu được mã hóa JSON. Sau đó tôi sử dụng hàm .each() của jQuery để lặp qua mảng đó nhưng trong Firefox nó lặp lại trong khi trong Chrome nó lặp lại.Thay đổi để .each() trong firefox và chrome

dữ liệu mà đến sback từ dịch vụ web là:

{ 
    "data": { 
    "610": { 
     "id": "610", 
     "url": "a url 1", 
     "description": "XXX YYY", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "608": { 
     "id": "608", 
     "url": "a url 1", 
     "description": "ytttgffrr", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "607": { 
     "id": "607", 
     "url": "a url 3", 
     "description": "rtretert3", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    "606": { 
     "id": "606", 
     "url": "a url 4", 
     "description": "xxxwwww", 
     "toc": "0000-01-00", 
     "active": "1" 
    }, 
    ... 
    } 
} 

Firefox đi 610 -> 606 trong khi chrome Fors 606 -> 610.

ý tưởng Bất kỳ lý do tại sao và những gì tôi có thể làm gì về nó ?

+0

có thể có liên quan http://stackoverflow.com/questions/640745/google-chrome-javascript-associative-arrays-evaluated-out-of-sequence –

+0

http://stackoverflow.com/questions/648139/is-the -order-of-fields-in-a-javascript-đối tượng-có thể dự đoán-khi-loop-qua-t – Dogbert

Trả lời

7

Thuộc tính trong đối tượng không có thứ tự vốn có. Đặc tả ECMAScript không đảm bảo rằng các câu lệnh for…in sẽ truyền đối tượng theo các thuộc tính của nó theo thứ tự bảng chữ cái. jQuery.each sử dụng for…in dưới mui xe khi được sử dụng trên các đối tượng.

Nếu thứ tự quan trọng đối với bạn, hãy sử dụng mảng thay vì đối tượng.

+0

@Matt Bạn đã sửa bài viết của tôi chỉ để bạn có thể loại bỏ upvote của bạn? Classy. –

0

Điều tra thuộc tính không có bất kỳ thứ tự được bảo đảm nào. Nếu bạn muốn liệt kê các thuộc tính theo thứ tự được bảo đảm, hãy đặt các giá trị thích hợp của đối tượng trong một mảng, sắp xếp chúng như bạn mong đợi và sau đó liệt kê nó.

Trong ES5, bạn có thể thực hiện việc này chỉ đơn giản bằng cách sử dụng Object.keys();

var keys = Object.keys(yourObj).sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

Nếu bạn không sử dụng HTML5 shim hoặc không thể sử dụng Object.keys() polyfiller, for in sẽ đủ;

var keys = []; 

for (var x in yourObj) { 
    yourObj.hasOwnProperty(x) && keys.push(x); 
} 

keys.sort(); 

for (var i=0;i<keys.length;i++) { 
    // use yourObj[keys[i]]; guaranteed to be in the right order 
} 

Tất nhiên, chức năng sort() trên đối tượng Array cho phép bạn chỉ định hàm cho thứ tự sắp xếp tùy chỉnh. Bạn cũng có thể sử dụng reverse() để đảo ngược thứ tự chính.

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