2009-05-11 3 views
0

Я пытаюсь отсортировать список XML по месяцам, фактические теги имеют больше атрибутов, чем только месяц, но для краткости я не буду включать их:E4X: сортировать XMLList по месяцам?

<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"/> 

Как отсортировать этот список в порядке по месяцам? ... Я не имею в виду в алфавитном смысле, я имею в виду JAN, FEB, MAR и т. Д.

Спасибо!

ответ

1

Я придумал это решение сегодня утром:

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

Это на самом деле не сортировать XMLList, но возвращает отсортированный копию.

1

Я не совсем понимаю, как вам даны данные, но если вы действительно хотите отсортировать XML, я предполагаю, что вам просто нужно написать специальную функцию сортировки.

Если у вас есть объекты или вы можете анализировать их на объекты, вы можете использовать пользовательскую функцию сравнения. Вот функция, которую я использовал для сортировки без учета регистра в коллекции массивов мобильных операторов. Я также использовал его, чтобы пропустить сортировки первого элемента в коллекции массива - CARRIER DEFAULT:

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

Если у вас есть для сортировки строк, перечислить месяцы, а затем вы можете просто сравнить их, как они будут отображаться в целые числа. Там может быть лучший способ сделать это, но в качестве быстрого решения я мог бы собрать хэш:

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

Вот некоторые псевдо-код для сравнения, которые могут быть использованы в пользовательских сравнения кода, или как своего рода функция для 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 
     } 
    } 

} 

Нет времени, чтобы отправить точный код, но надеюсь, что это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^