[英]Flex sorting of XMLListCollection subelements
在Flex Webapp中,是否有一种简单的方法可以根据子级的属性对XML元素的子级进行排序? 示例如下:
XMLListCollection:
<a anotherProp="ABCDE">
<e prop="AB">1</element>
<e prop="BC">2</element>
</a>
<a anotherProp="FGEH">
<e prop="HF">3</element>
<e prop="AD">4</element>
<e prop="AC">5</element>
</a>
我想根据它们的“ prop”属性在每个<a>
元素中分别对<e>
元素进行排序。 我用于生成包含<a>
元素的数组的代码如下:
for each(var node:XML in initialInput:XMLListCollection){
if(node.localName()=="a"){
//I was hoping to be able to sort the <e> children of the node variable here
xmlListCollectionVar.addItem(node);
}
}
最后,我希望<a>
保持其定义的顺序,但根据<e>
prop>属性对它们的<e>
子级进行排序。 到目前为止,如果我尝试:
node.children()。sort = someSortVar
someSortVar的字段设置为:
SortFields(“ e。@ prop”,...)
我收到有关空值的异常。 有什么方法可以将子级列表转换为XMLListCollection,对其进行排序并将其重新集成到node变量中? 感谢您的任何答复。
您可以将数组上的sort函数与compareFunction一起使用。
... args-用于指定比较函数和确定排序行为的一个或多个值的参数。 此方法使用语法和参数顺序Array.sort(compareFunction,sortOptions) ,参数定义如下:
compareFunction-一个比较函数,用于确定数组中元素的排序顺序。 此参数是可选的。 比较函数应采用两个参数进行比较。 给定元素A和B,compareFunction的结果可以具有以下三个值之一:-1,如果A应该在排序序列中出现在B之前0,如果A等于B 1,如果A应该出现在排序之后的B之后sequence sortOptions-一个或多个数字或定义的常量,用|分隔 (按位或)运算符,可将排序行为更改为默认值。 此参数是可选的。 下面的值对于sortOptions是可接受的:1或Array.CASEINSENSITIVE 2或Array.DESCENDING 4或Array.UNIQUESORT 8或Array.RETURNINDEXEDARRAY 16或Array.NUMERIC有关更多信息,请参见Array.sortOn()方法。
在Adobe论坛上找到了合适的代码实现-很抱歉不首先浏览那里。
我提出了两个解决方案:第一个解决方案涉及将XMLList转换为数组并对该数组进行排序:
for each (var a:XML in elt..a)
{
var children:Array = toArray(a.children());
children.sortOn("@prop");
a.setChildren(new XMLList());
for each (var c:XML in children)
{
a.appendChild(c);
}
}
第二个涉及使用XMLListCollection
的sort属性,尽管我相信<a>子级是XMLList
,而不是XMLListCollection
:
var sort:Sort = new Sort()
sort.fields = [new SortField("@prop")];
for each (var a:XML in xml..a)
{
var xcoll:XMLListCollection = new XMLListCollection(a.children());
xcoll.sort = sort;
xcoll.refresh();
a.setChildren(xcoll.copy());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.