2011-02-01 28 views
12

Tôi có một số dữ liệu json trong một đối tượng bản đồ được sắp xếp theo thời gian. Khóa là một số nguyên và giá trị là một đối tượng chứa dấu thời gian. Tuy nhiên, khi tôi cố gắng lặp lại dữ liệu này với hàm jQuery $ .each, kết quả sẽ được sắp xếp lại bằng khóa thay vào đó. Làm cách nào để tôi có thể lặp lại bộ sưu tập các đối tượng theo thứ tự ban đầu?Lặp lại đối tượng jQuery JSON theo thứ tự ban đầu

Mã dụ:

$.getJSON(url, addPages); 
function addPages(pageData) { 
    $.each(pageData, function(key,value){ 
     alert(key+' : '+value); 
    } 
} 

Trả lời

6

Bạn có thể sao chép các cặp giá trị key vào một mảng của các đối tượng và sau đó sử dụng Array.sort để đặt chúng theo thứ tự.

// $.getJSON(url, addPages); //removed for test purposes 
function addPages(pageData) { 
    var pageItems = []; 
    $.each(pageData, function(key,value){ 
     pageItems.push({ key: key, value: value }); 
    }); 
    // Assuming you can do arithmetic on timestamps 
    pageItems.sort(function(a,b){ return a.value.timeStamp - b.value.timeStamp; }); 
    $.each(pageItems, function(index,pageItem){ 
     alert(pageItem.key+' : '+pageItem.value.timeStamp); 
    }); 
} 

kịch bản thử nghiệm của tôi:

var testData = { 
    '12': { timeStamp: 55 }, 
    '16': { timeStamp: 655 }, 
    '123': { timeStamp: 455 }, 
    '312': { timeStamp: 955 }, 
    '132': { timeStamp: 255 }, 
    '126': { timeStamp: 455 }, 
    '162': { timeStamp: 355 } 
    }; 
addPages(testData); 
+0

Tôi thực sự đã đi với một cái gì đó giống như những gì bạn đăng, nhưng đoạn của bạn có đầy đủ các lỗi cú pháp btw. – Doug

+0

Xin lỗi về lỗi cú pháp - Tôi đã sửa nó ngay bây giờ. (Tôi đổ lỗi cho đêm muộn và tiếp xúc gần đây với Ruby) –

11

Đối tượng là bộ un theo lệnh. Bạn không thể chỉ định thứ tự trên chúng theo cách khiếu nại trên nhiều trình duyệt. Không có khái niệm về thứ tự ban đầu trừ khi nó đã được đặt hàng bởi một quy tắc.

Vì vậy hãy sắp xếp dữ liệu trên máy chủ và sau đó liệt kê dữ liệu trên cùng một thứ tự được sắp xếp.

Ngoài định dạng JSON là

{ "values": [ 
    { "someKey": "someVal" }, 
    { "someOtherKey": "someOtherVal" } 
] } 

Bạn có thể lặp qua mảng với một vòng lặp for (i = 0; i < len; i++) và "garantuee" trật tự ban đầu.

0

Nếu theo "nguyên bản", bạn có nghĩa là dấu thời gian trong đối tượng, tôi không nghĩ có bất kỳ tùy chọn nào khác ngoài cách phân loại rõ ràng mảng đầu tiên và chỉ sau đó lặp lại nó.

2

Trong các đối tượng firefox giữ nguyên thứ tự .. trong chrome thì không. Không có ý tưởng về trình duyệt khác, nhưng hai triển khai khác nhau đã cho thấy rằng bạn không thể dựa vào nó.

Nếu bạn cần thứ gì đó được đặt hàng, hãy sử dụng danh sách; nếu bạn cần một cái gì đó với cả hai phím không phải số và một trật tự nhất định, cách dễ nhất sẽ được sử dụng một danh sách [key, value] danh sách:

[['abd', 'def'], ['ghi', 'jkl']] 
+0

Dưới đây là liên kết liên quan đến vấn đề trong Chrome: http://code.google.com/p/v8/issues/detail?id=164 –

+0

Bất kỳ lý do để thích [k, v] tuple hơn một đối tượng {k: v}? – Raynos

+0

@FelixKing nó không phải là một vấn đề nhiều như một khoảng cách trong việc thực hiện. Có tất cả các hợp lệ, chỉ không nhất quán. – Raynos

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