2013-10-08 7 views
6

Ich habe einige JSON, das wie formatiert:Sortierung JSON (durch spezifisches Element) alphabetisch

places =[ 
    { 
     "city":"Los Angeles", 
     "country":"USA", 
    }, 
    { 
     "city":"Boston", 
     "country":"USA", 
    }, 
    { 
     "city":"Chicago", 
     "country":"USA", 
    }, 
] 

et cetera ...

Ich versuche, diese BY CITY alphabetisch zu sortieren und bin mit Schwierigkeiten dabei zu haben. Ich glaube, die Wurzel meines Problems scheint die Reihenfolge der Zeichen zu bestimmen (gegen Zahlen). Ich habe eine einfache versucht:

noch diese Subtraktion weiß nicht, was zu tun ist. Kann mir jemand helfen?

Antwort

21

Leider gibt es keine generische "compare" -Funktion in JavaScript, um einen geeigneten Wert für sort() zurückzugeben. Ich würde eine compareStrings-Funktion schreiben, die Vergleichsoperatoren verwendet und sie dann in der Sortierfunktion verwendet.

function compareStrings(a, b) { 
    // Assuming you want case-insensitive comparison 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 

    return (a < b) ? -1 : (a > b) ? 1 : 0; 
} 

places.sort(function(a, b) { 
    return compareStrings(a.city, b.city); 
}) 
+0

holy crap, Matti, ich schulde Ihnen ein Bier. Warum funktioniert der Vergleich zwischen a

+2

Der Vergleich funktioniert, weil '<' und Freunde definiert sind, lexikographische Sortierfolgen zu verwenden. Intern überprüft es jedes übereinstimmende Zeichen und wenn es zwei verschiedene Unicode-Werte findet, kehrt es zurück, was zu einer "Wörterbuch" -Anordnung führt. Dies ist auch der Grund, warum ich zuLowerCase() - Aufrufen nur für den Fall hinzugefügt habe, weil der Vergleich selbst nur Codepunktwerte vergleicht. Es prüft nicht auf Groß-/Kleinschreibung. –

4

Mattis Lösung ist korrekt, aber Sie können es einfacher schreiben. Sie benötigen den zusätzlichen Funktionsaufruf nicht; Sie können die Logik direkt in den Callback sort setzen.

Für Groß- und Kleinschreibung Sortierung:

places.sort(function(a, b) { 
    a = a.city.toLowerCase(); 
    b = b.city.toLowerCase(); 

    return a < b ? -1 : a > b ? 1 : 0; 
}); 

Für case-sensitive Sortierung:

places.sort(function(a, b) { 
    return a.city < b.city ? -1 : a.city > b.city ? 1 : 0; 
});