E4X : 월별 xmllist를 정렬 하시겠습니까?
-
21-08-2019 - |
문제
나는 월별 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"/>
이 목록을 월 순서대로 정렬하려면 어떻게해야합니까? ... 나는 알파벳순으로 1 월, 2 월, 3 월 등을 의미하지 않는다.
감사!
해결책 2
오늘 아침이 솔루션을 생각해 냈습니다.
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를 정렬하지는 않지만 정렬 된 사본을 반환합니다.
다른 팁
데이터가 어떻게 제공되는지는 확실하지 않지만 실제로 XML을 정렬해야한다면 사용자 정렬 기능을 작성해야한다고 생각합니다.
개체가 있거나 객체로 구문 분석 할 수있는 경우 사용자 정의 비교 함수를 사용할 수 있습니다. 다음은 모바일 캐리어의 어레이 컬렉션에서 케이스 insensitive 정렬을 수행하는 데 사용했던 기능입니다. 또한 배열 컬렉션에서 첫 번째 요소를 정렬하는 데 사용했습니다 - 캐리어 기본값 :
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
}
}
}
정확한 코드를 게시 할 시간은 없지만 이것이 도움이되기를 바랍니다!
제휴하지 않습니다 StackOverflow