2010-07-12 30 views
9

Önce bir anahtarla sıralamak istediğiniz bir JSON nesnesine, sonra SQL'de iki sütuna göre sıralamaya benzer ikinci bir anahtarla var. Ben LASTNAME sonra GroupID bütün sonuçlarını sipariş ve istiyoruzJSON nesnesini iki tuşla nasıl sipariş verebilirim?

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

: İşte olurdu JSON bir örneğidir. Bir anahtarla sıralamak için birden çok değil JSON sıralama işlevini kullandım.

Herhangi bir yardım harika olurdu.

+1

Örneğiniz nesne özelliklerinin bir karması içindir. Tanım olarak, bunlar sıralanmaz. Sıralamak istediğiniz bu nesnelerden oluşan bir dizi var mı? –

+0

Bu bir dizi JSON nesnesi mi? – Castrohenge

cevap

9

Eğer nesneler dizisi varsayarsak:

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

Sen sıralamayı yapmak için özel bir karşılaştırıcı kullanabilirsiniz. GROUPID ilk sıralamak için, ve daha sonra LASTNAME göre, iki nesne karşılaştırmak mantık olacaktır:

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; 

, nesne dizi sıralama algoritma üzerinde kullanımı ve dizi sıralama yöntemi çağırın. Sıralama yapıldıktan sonra, data öğelerin gereken sıralı sırada olması gerekir.

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

İşte Geçenlerde cevap başka çok similar question bu. JQuery'yi kullanarak birden çok sütun üzerinde sıralama yapmakla ilgilidir, ancak jQuery parçasını kolayca çıkarabilirsiniz. Birden çok sütuna uzanabilen bazı özelleştirilebilir yaklaşımlar sunar.

+0

Neden bir anahtar grubunu karşılaştırmıyorsunuz? Bu türden daha genel mi yoksa bir şey mi özledim? Yanıtımı aşağıya bakın. – Mic

+0

@Mic - bağlantılı yanıtta tam olarak yaptığım şey budur. Bütün şeyi tekrar yazmak istemedim, bu yüzden ona bir link ekledim. – Anurag

36

Burada birden çok sütun ile, nesneler dizisi sıralamak için genel bir yoludur:

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)] 
    ); 
}); 

, üzerinde sıralamak için diğer sütunları eklemek için dizi karşılaştırıldığında diğer öğeleri ekleyebilir.

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), ...] 
    ); 
}); 

DÜZENLEME: Aşağıdaki @PhilipZ comment başına, JS dizi karşılaştırma komadan ayrılmış dizeleri bunları dönüştürmek.

+4

Keşke size bir baggillion upvotes verebilirdim .. – Alex

+1

Bu cevap için bir tane yeterli;) Size yardımcı görmek için sevindim! – Mic

+0

Soru Neden diziler? Neden sadece (a.name - b.name) \t || (a.id - b.id) ' Ve şöyle devam edebilirsiniz: (a.name - b.name) \t || (a.id - b.id) || (a.idd - b.idd) ' –

İlgili konular