首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对XML和XMLList进行排序的Flex新手XMLList问题

对XML和XMLList进行排序的Flex新手XMLList问题
EN

Stack Overflow用户
提问于 2009-12-09 05:27:34
回答 2查看 3K关注 0票数 1

是否可以对XMLList进行排序?我能在上面找到的所有示例都创建了一个新的XMLListCollection,如下所示:

代码语言:javascript
复制
MyXMLListCol = new XMLListCollection(MyXMLList);

我不认为本例中的XMLListCollection引用了XMLList,所以对它进行排序会使我的XMLList无法排序,对吗?

如何直接对XMLList进行排序?

谢谢~迈克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-11 05:43:52

所以我最终修改了我的搜索词,实际上我给出了一个答案。使用我在这里学到的技术:http://freerpad.blogspot.com/2007/07/more-hierarchical-sorting-e4x-xml-for.html

我想出了这个:

代码语言:javascript
复制
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进行排序的能力可能非常重要。

票数 2
EN

Stack Overflow用户

发布于 2009-12-10 13:57:49

虽然没有与Array.sortOn函数等效的本机函数,但它足够简单,可以实现您自己的排序算法:

代码语言:javascript
复制
// 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要容易得多,错误也少得多。此外,如果其他人正在阅读您的代码,他们会发现更容易理解。请帮你自己一个忙,避免在这件事上重复发明轮子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1869964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档