2010-07-12 26 views
9

Tôi có một đối tượng JSON mà tôi muốn sắp xếp theo một khóa đầu tiên, sau đó bằng một khóa thứ hai tương tự như thứ tự của hai cột trong SQL. Đây là mẫu JSON tôi sẽ có:Làm thế nào để đặt một đối tượng JSON bằng hai khóa?

{ 
    "GROUPID":3169675, 
    "LASTNAME":"Chantry" 
} 

Tôi muốn đặt hàng tất cả kết quả theo GROUPID và sau đó bởi LASTNAME. Tôi đã sử dụng hàm sắp xếp JSON để sắp xếp theo một khóa nhưng không phải là nhiều.

Mọi trợ giúp đều tuyệt vời.

+1

Ví dụ của bạn dành cho băm thuộc tính đối tượng. Theo định nghĩa, chúng không được sắp xếp. Tôi giả sử bạn có một mảng các đối tượng mà bạn muốn sắp xếp theo? –

+0

Đây có phải là một mảng các đối tượng JSON không? – Castrohenge

Trả lời

9

Giả sử bạn có một mảng các đối tượng:

var data = [ 
    { "GROUPID":3169675, "LASTNAME":"Chantry" }, 
    { "GROUPID":3169612, "LASTNAME":"Doe" }, 
    ... 
]; 

Bạn có thể sử dụng một so sánh tùy chỉnh để thực hiện phân loại. Để sắp xếp đầu tiên bởi GROUPID, và sau đó bởi LASTNAME, logic để so sánh hai đối tượng sẽ là:

if GROUPID of first is smaller than second 
    return -1; 
else if GROUPID of first is larger than second 
    return 1; 
else if LASTNAME of first is smaller than second 
    return -1; 
else if LASTNAME of first is larger than second 
    return 1; 
else 
    return 0; 

Để sắp xếp các mảng đối tượng, sử dụng các thuật toán ở trên và gọi phương thức sắp xếp trên mảng. Sau khi sắp xếp xong, data sẽ có các phần tử theo thứ tự được sắp xếp theo yêu cầu.

data.sort(function(a, b) { 
    // compare a and b here using the above algorithm 
}); 

Đây là một số khác similar question Tôi đã trả lời gần đây. Nó liên quan đến phân loại trên nhiều cột bằng cách sử dụng jQuery, nhưng bạn có thể loại bỏ phần jQuery dễ dàng. Nó trình bày một số phương pháp tùy chỉnh có thể mở rộng đến nhiều cột.

+0

Tại sao bạn không so sánh một mảng các khóa? Nó làm cho các loại chung chung hơn hoặc tôi bỏ lỡ một cái gì đó? Xem câu trả lời của tôi dưới đây. – Mic

+0

@Mic - đó là chính xác những gì tôi đang làm trong câu trả lời được liên kết. Tôi không muốn viết lại toàn bộ nội dung một lần nữa, vì vậy chỉ cần thêm một liên kết vào nó. – Anurag

36

Đây là một cách chung chung để sắp xếp một mảng của các đối tượng, với nhiều cột:

var arr = [ 
    { id:5, name:"Name3" }, 
    { id:4, name:"Name1" }, 
    { id:6, name:"Name2" }, 
    { id:3, name:"Name2" } 
], 

// generic comparison function 
cmp = function(x, y){ 
    return x > y ? 1 : x < y ? -1 : 0; 
}; 

//sort name ascending then id descending 
arr.sort(function(a, b){ 
    //note the minus before -cmp, for descending order 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id)], 
     [cmp(b.name, a.name), -cmp(b.id, a.id)] 
    ); 
}); 

Để thêm các cột khác để sắp xếp trên, bạn có thể thêm các mặt hàng khác trong việc so sánh mảng.

arr.sort(function(a, b){ 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id), cmp(a.other, b.other), ...], 
     [cmp(b.name, a.name), -cmp(b.id, a.id), cmp(b.other, a.other), ...] 
    ); 
}); 

EDIT: mỗi @PhilipZ bình luận dưới đây, so sánh mảng trong JS chuyển đổi chúng trong chuỗi phân cách bằng hôn mê.

+4

Tôi ước tôi có thể cung cấp cho bạn một số tiền upgotes .. – Alex

+1

Một câu trả lời này là đủ;) Rất vui được thấy nó đã giúp bạn! – Mic

+0

Câu hỏi Tại sao lại là mảng? Tại sao không chỉ '(a.name - b.name) \t || (a.id - b.id) ' Và bạn có thể tiếp tục như sau: ' (a.name - b.name) \t || (a.id - b.id) || (a.idd - b.idd) ' –

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