E4X:按月排序XMLList?

时间:2009-05-11 19:09:21

标签: flex e4x

我试图按月对XML列表进行排序,实际标签的属性多于月份,但为了简洁起见,我不会包含它们:

<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等。

谢谢!

2 个答案:

答案 0 :(得分: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
      }
   }

}

没时间发布确切的代码,但希望这有帮助!

答案 1 :(得分: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进行排序,而是返回一个已排序的副本。