2009-05-11 8 views
0

Ich versuche, eine XML-Liste von Monat zu sortieren, die tatsächlichen Tags haben mehr Attribute als nur Monat, aber der Kürze halber werde ich sie nicht:E4X: XMLList nach Monat sortieren?

<var month="OCT"/> 
<var month="NOV"/> 
<var month="JAN"/> 
<var month="MAR"/> 
<var month="SEP"/> 
<var month="JUL"/> 
<var month="APR"/> 
<var month="AUG"/> 
<var month="DEC"/> 
<var month="FEB"/> 
<var month="MAY"/> 
<var month="JUN"/> 

Wie kann ich diese Liste in der Reihenfolge von Monat sortieren? ... ich meine nicht alphabetisch ich meine JAN, FEB, MAR usw.

Danke!

Antwort

1

Ich kam mit dieser Lösung heute Morgen:

function sortXMLListByMonth(xmlList:XMLList):XMLList 
{ 
    var months:Array = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']; 
    var xml:XML = new XML(<temp></temp>); 
    for(var i:uint = 0; i<months.length; i++) 
    { 
     var tmp:XMLList = xmlList.(@month == months[i]); 
     xml.appendChild(tmp); 
    } 
    return xml.children(); 
} 

Es ist eigentlich nicht das XMLList sortieren, sondern eine sortierte Kopie zurück.

1

Ich bin nicht ganz klar, wie Sie die Daten erhalten, aber wenn Sie tatsächlich die XML zu sortieren haben, ich schätze, Sie müssen nur eine benutzerdefinierte Sortierfunktion schreiben.

Wenn Sie Objekte haben oder in Objekte zerlegen können, können Sie eine benutzerdefinierte Vergleichsfunktion verwenden. Hier ist eine Funktion, die ich verwendet habe, um eine Sortierung ohne Berücksichtigung von Groß-/Kleinschreibung in einer Array-Sammlung von mobilen Trägern durchzuführen. Ich habe es auch in der Anordnung Sammlung Sortier das erste Element zu überspringen - CARRIER STANDARD:

private function x(event:ResultEvent):void{ 
       for(i=0; i<event.result.carriers.carrier.length; i++){ 
        _mobile_carriers.addItem({label:event.result.carriers.carrier[i].name, data:event.result.carriers.carrier[i].id}); 
       } 
       var sort:Sort = new Sort(); 
       sort.fields = [new SortField("label")]; 
       sort.compareFunction = caseInsensitiveSort; 
       _mobile_carriers.sort = sort; 
       _mobile_carriers.addItemAt({label:"Mobile Carrier", data:0},0); 
       _mobile_carriers.refresh(); 
} 

private function caseInsensitiveSort(obj1:Object, obj2:Object, fields:Array):int{ 
      if(obj1.label == CARRIER_DEFAULT) return -1; 
      if(obj2.label == CARRIER_DEFAULT) return 1; 
      return (obj1.label.toLowerCase() < obj2.label.toLowerCase()) ? -1 : 1; 
     } 

Wenn Sie die Saiten sortieren müssen, die Monate aufzählen und dann kann man nur vergleichen, wie sie auf ganze Zahlen abbildet. Es kann ein besserer Weg, dies zu tun, sondern als eine schnelle Lösung könnte ich zusammen eine hash:

month_hash= 
"JAN" => 1 
"FEB" => 2 
"MAR" => 3 
... 

Hier einig Pseudo-Code für einen Vergleich, dass in benutzerdefiniertem Code vergleichen, verwendet werden kann, oder als eine Art Funktion für Sort()

function compare(s1,s2){ 
    var m1 = "" 
    var m2 = "" 
    if (s1 =~ /month="([A-Z]+)"/) m1 = $1; 
    if (s2 =~ /month="([A-Z]+)"/) m2 = $1; 

    if(m1 == "" or m2 == ""){ 
    throw exception; 
    }else{ 
     if(month_hash(m1) > month_hash(m2)){ 
     // string 1's month comes after string 2's month 
     // return whatever will indicate that 
     return 1; 
     }else if(month_hash(m1) < month_hash(m2)){ 
     // string 1's month comes before string 2's month 
     // return whatever will indicate that 
     return -1; 
     }else{ 
     //same month 
     //return 0 
     } 
    } 

} 

Keine Zeit, genauen Code zu posten, aber hoffe, das hilft!