是否可以对XMLList进行排序?我可以在其上找到的所有示例都创建了一个新的XMLListCollection:
MyXMLListCol = new XMLListCollection(MyXMLList);
我认为在这种情况下XMLListCollection没有对XMLList的任何引用,所以对它进行排序会使我的XMLList不被排序,这是正确的吗?
如何直接对XMLList进行排序?
由于 〜麦克
答案 0 :(得分:2)
所以我终于改变了我的搜索词,我实际上已经回答了这个问题。 使用我从这里得到的技术: http://freerpad.blogspot.com/2007/07/more-hierarchical-sorting-e4x-xml-for.html
我能够想出这个:
public function sortXMLListByAttribute(parentNode:XML,xList:XMLList,attr:String):void{
//attr values must be ints
var xListItems:int = xList.length();
if(xListItems !=0){
var sortingArray:Array = new Array();
var sortAttr:Number = new Number();
for each (var item:XML in xList){
sortAttr = Number(item.attribute(attr));
if(sortingArray.indexOf(sortAttr)==-1){
sortingArray.push(sortAttr);
}
//piggy back the removal, just have to remove all of one localName without touching items of other localNames
delete parentNode.child(item.localName())[0];
}
if( sortingArray.length > 1 ) {
sortingArray.sort(Array.NUMERIC);
}
var sortedList:XMLList = new XMLList();
for each(var sortedAttr:Number in sortingArray){
for each (var item2:XML in xList){
var tempVar:Number = Number(item2.attribute(attr));
if(tempVar == sortedAttr){
sortedList += item2
}
}
}
for each(var item3:XML in sortedList){
parentNode.appendChild(item3);
}
}
}
工作得非常快,并保持原始XML变量的更新。我知道我可能正在重新发明轮子只是为了不使用XMLListCollection,但我认为对XML和XMLLists进行排序的能力非常重要
答案 1 :(得分:0)
虽然没有与Array.sortOn函数等效的本机,但实现自己的排序算法还是微不足道的:
// Bubble sort.
// always initialize variables -- it save memory.
var ordered:Boolean = false;
var l:int = xmlList.length();
var i:int = 0;
var curr:XML = null;
var plus:XML = null;
while( !ordered )
{
// Assume that the order is correct
ordered = true;
for( i = 0; i < l; i++ )
{
curr = xmlList[ i ];
plus = xmlList[ i + 1 ];
// If the order is incorrect, swap and set ordered to false.
if( Number( curr.@order ) < Number( plus.@order ) )
{
xmlList[ i ] = plus;
xmlList[ i + 1 ] = curr;
ordered = false;
}
}
}
但是,实际上,使用XMLListCollection要容易得多且错误少。此外,如果其他人正在阅读您的代码,他们会发现它更容易理解。请帮个忙,避免重新发明轮子。