2009-08-31 17 views
49

Szukałem na chwilę i chcesz sposób sortowania obiektu JavaScript tak:Sortowanie obiekt JavaScript o nazwie własności

{ 
    method: 'artist.getInfo', 
    artist: 'Green Day', 
    format: 'json', 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716' 
} 

i sortowania jest alfabetycznie według nazwy, aby uzyskać:

{ 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716', 
    artist: 'Green Day', 
    format: 'json', 
    method: 'artist.getInfo' 
} 

Nie mogę znaleźć żadnego kodu, który to zrobi. Czy ktoś może mi pomóc?

+0

http://www.javascriptkit.com/javatutors/arraysort.shtml - Godny samouczek dotyczący sortowania złożonych obiektów JS. http://www.highdots.com/forums/javascript/re-sorting-json-data-270187.html - Kolejny przykład --- Oto pełne odwołanie do funkcji sortowania, jeśli chcesz uzyskać szczegóły https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort -Duża edycja, przysięgam! –

+0

Problemem jest to, że te artykuły pokazują, jak sortować tablicę obiektów. Próbuję posortować obiekt wypełniony przedmiotami. Czy te same przykłady zadziałają w mojej sprawie, jeśli tak, możesz podać przykład? Przepraszam, utknąłem na tym: s – matto1990

+5

To jest starożytne pytanie, ale jestem pedantem, więc po raz miliardowy: nie ma czegoś takiego jak obiekt JSON - przynajmniej nie w sposób, w jaki się do tego odnosisz. Istnieją obiekty javascript i ciągi JSON. –

Odpowiedz

73

Zgodnie z definicją, order of keys in an object is undefined, więc prawdopodobnie nie będzie można tego zrobić w sposób przyszłościowy. Zamiast tego powinieneś pomyśleć o posortowaniu tych kluczy, gdy obiekt jest faktycznie wyświetlany użytkownikowi. Niezależnie od tego, jakiej kolejności sortowania używa wewnętrznie, tak naprawdę nie ma to znaczenia.

Zgodnie z konwencją większość przeglądarek zachowuje kolejność klawiszy w obiekcie w kolejności, w jakiej zostały dodane. Tak, można to zrobić, ale nie spodziewaj się, że zawsze działa:

function sortObject(o) { 
    var sorted = {}, 
    key, a = []; 

    for (key in o) { 
     if (o.hasOwnProperty(key)) { 
      a.push(key); 
     } 
    } 

    a.sort(); 

    for (key = 0; key < a.length; key++) { 
     sorted[a[key]] = o[a[key]]; 
    } 
    return sorted; 
} 
+0

To wydaje się działać idealnie. Muszę mieć oko na to, że łamie się w przyszłych przeglądarkach, ale na razie działa. Dzięki za pomoc :) – matto1990

+0

Może faktycznie zawsze działa, i jest skodyfikowany do standardu Ecmascript, ale nadal nie jest bezpiecznym założeniem, na którym można polegać, ponieważ posiadanie określonej kolejności nie jest logicznie częścią "obiektu" ". Jeśli chcesz zdefiniować porządek, powinieneś użyć tablicy. – Breton

+0

Jedynym powodem, dla którego muszę to zrobić, jest posortowanie wartości jeden raz, aby wygenerować podpis API zdefiniowany na tej stronie w sekcji 6: http://www.last.fm/api/webauth Jeśli korzystałem to więcej niż to, że użyłbym tablicy i oni to sortują. – matto1990

12

funkcja ta przyjmuje obiekt i zwraca posortowaną tablicę tablic formie [key, value]

function (o) { 
    var a = [],i; 
    for(i in o){ 
    if(o.hasOwnProperty(i)){ 
     a.push([i,o[i]]); 
    } 
    } 
    a.sort(function(a,b){ return a[0]>b[0]?1:-1; }) 
    return a; 
} 

Struktura danych obiektu nie ma dobrze zdefiniowanej kolejności. Pod względem matematycznym zbieranie kluczy w obiekcie jest zbiorem nieuporządkowanym i powinno być traktowane jako takie. Jeśli chcesz zdefiniować porządek, powinieneś użyć tablicy, ponieważ tablica mająca porządek jest założeniem, na którym możesz polegać. Obiekt mający jakąś kolejność jest czymś, co pozostaje do kaprysów implementacji.

3
// if ya need old browser support 
Object.keys = Object.keys || function(o) { 
var result = []; 
for(var name in o) { 
    if (o.hasOwnProperty(name)) 
     result.push(name); 
} 
    return result; 
}; 

var o = {c: 3, a: 1, b: 2}; 
var n = sortem(o); 

function sortem(old){ 
    var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]}); 
    return newo; 
} 

// deep 
function sortem(old){ 
    var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) }); 
    return newo; 
} 
sortem({b:{b:1,a:2},a:{b:1,a:2}}) 
+0

Całkiem miły i zgrabny, ale niestety Object.keys() nie jest obsługiwany w IE <9, a także w trybie Quirks dowolnego IE> = 9. Zobacz [MSDN's IE Dev Center] (http://msdn.microsoft.com/en-us/library/ie/ff688127 (v = vs.94) .aspx). – Jpsy

+0

Dodano poly fill to above answer –

+0

Jeśli masz na myśli głęboki rodzaj obj, zredagowałem odpowiedź powyżej. "Nowy" był literówką. –

Powiązane problemy