2013-09-30 101 views
0

我試圖排序使用字母和數字AS3 - 排序ArrayCollection的字母數字值

目前我得到的ArrayCollection「B12,C1,B1,B3,B4,B5,B6,B7,B8 ,b9,b10,b11,b0,b13,b14,b15「但是希望」b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15, c1「

請任何人都可以建議when're我出錯了?

var dataSortField:SortField = new SortField(); 
    dataSortField.name = "order"; 
    dataSortField.numeric = false; 
    dataSortField.compareFunction = sortAlphaNumeric; 
var numericDataSort:Sort = new Sort(); 
    numericDataSort.fields = [dataSortField]; 
pageArrCol.sort = numericDataSort; 

private function sortAlphaNumeric(a:String, b:String):int { 
    var reA:RegExp = /[^a-zA-Z]/g; 
    var reN:RegExp = /[^0-9]/g; 
    var aA:String = a.replace(reA,""); 
    var bA:String = b.replace(reA,""); 
    if (aA === bA) { 
     var aN:int = parseInt(a.replace(reN,""),10); 
     var bN:int = parseInt(b.replace(reN,""),10); 
     return aN === bN ? 0 : aN > bN ? 1 : -1; 
    } else { 
     return aA > bA ? 1 : -1; 
    } 
} 
+0

什麼是你所期望的結果?你看到的結果是什麼?零到底是一個問題? – JeffryHouser

+0

嗨,我剛剛編輯了這個問題 –

+0

你在做什麼? sortAlphaNumeric函數背後的想法是什麼?你能假設一個恆定的/一致的字母結構'letter'+'number'嗎? – JeffryHouser

回答

0

假設B12,C1,B1是你的輸入格式

您可能意味着,a.match(正則表達式)[0]

var reA:RegExp = /[a-zA-Z]+/g; 
var reN:RegExp = /[0-9]+/g; 

var aA:String = a.match(reA)[0]; 
var bA:String = b.match(reA)[0]; 

if (aA === bA) { 
    var aN:int = parseInt(a.match(reN)[0],10); 
    var bN:int = parseInt(b.match(reN)[0],10); 
    return aN === bN ? 0 : aN > bN ? 1 : -1; 
}else { 
    return aA > bA ? 1 : -1; 
} 

我沒有測試過這一點,但你不應該使用替換,而是使用匹配。另外,正則表達式是錯誤的。你必須重新審視正則表達式。

+1

謝謝,但我會在下面的其他括號中返回什麼? –

+0

其他塊將與您的相同。 – Zeus

0
myArrayCollectionToSort.source.sortOn("order", sortAlphaNumeric); 

private function sortAlphaNumeric(a:String, b:String):int { 
    var reA:RegExp = /[^a-zA-Z]+/g; 
    var reN:RegExp = /[^0-9]+/g; 
    var aA:String = a.match(reA)[0]; 
    var bA:String = b.match(reA)[0]; 
    if (aA == bA) { 
     var aN:int = parseInt(a.match(reN)[0],10); 
     var bN:int = parseInt(b.match(reN)[0],10); 
     return aN == bN ? 0 : aN > bN ? 1 : -1; 
    } 
    return aA > bA ? 1 : -1; 
} 

我不測試它,但它應該工作,並且數組的速度比ArrayCollection快。 (arraycollection.source是一個數組)。如果排序的ArrayCollection被綁定,你需要,如果你想綁定到工作派遣一個刷新事件:

myArrayCollectionToSort.dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE, false, false, CollectionEventKind.REFRESH)); 

myArrayCollectionToSort.refresh();