好的,我正在按字母顺序对XMLListCollection进行排序。不过,我有一个问题。如果值是"ALL“,我希望它在列表中排在第一位。在大多数情况下,这种情况已经发生了,但是作为数字的值被排序在"ALL“之前。我希望"ALL“始终是我的dataProvider中的第一个选项,然后是其余的字母顺序。
因此,我正在尝试编写自己的排序函数。有没有一种方法可以检查其中一个值是不是全部,如果不是,就告诉它对这些值进行常规比较?
这就是我所拥有的:
function myCompare(a:Object, b:Object, fields:Array = null):int
{
if(String(a).toLowerCase() == 'all')
{
return -1;
}
else
if(String(b).toLowerCase() == 'all')
{
return 1;
}
// NEED to return default comparison results here?
}
//------------------------------
var sort:Sort = new Sort();
sort.compareFunction = myCompare;对于我正在尝试做的事情,有什么解决方案吗?
发布于 2009-09-02 15:03:43
好吧,我尝试了一些东西,我真的很惊讶它真的起作用了,但这是我做的。
Sort类有一个名为internalCompare的私有函数。因为它是私有的,所以您不能调用它。但是有一个名为compareFunction的getter函数,如果没有定义比较函数,它将返回对internalCompare函数的引用。所以我所做的就是获取这个引用,然后调用它。
private function myCompare(a:Object, b:Object, fields:Array = null):int
{
if(String(a).toLowerCase() == 'all')
{
return -1;
}
else if(String(b).toLowerCase() == 'all')
{
return 1;
}
// NEED to return default comparison results here?
var s:Sort = new Sort();
var f:Function = s.compareFunction;
return f.call(null,a,b,fields);
}发布于 2009-10-09 13:32:36
John Isaacks的解决方案很棒,但他忘记了“field”变量,并且他的示例不适用于更复杂的对象(除了String)。
示例:
// collection with custom objects. We want to sort them on "value" property
// var item:CustomObject = new CustomObject();
// item.name = 'Test';
// item.value = 'Simple Value';
var collection:ArrayCollection = new ArrayCollection();
var s:Sort = new Sort();
s.fields = [new SortField("value")];
s.compareFunction = myCompare;
collection.sort = s;
collection.refresh();
private function myCompare(a:Object, b:Object, fields:Array = null):int
{
if(String((a as CustomObject).value).toLowerCase() == 'all')
{
return -1;
}
else if(String((b as CustomObject).value).toLowerCase() == 'all')
{
return 1;
}
// NEED to return default comparison results here?
var s:Sort = new Sort();
s.fields = fields;
var f:Function = s.compareFunction;
return f.call(null,a,b,fields);
}发布于 2010-05-14 22:55:46
谢谢你们,这帮了大忙了。在我们的例子中,我们需要底部的所有空行(在DataGrid中)。所有非空行都应该正常排序。我们的行数据都是动态对象(从JSON转换而来) --对ValidationHelper.hasData()的调用只是检查行是否为空。由于某些原因,这些字段有时包含dataField字符串值而不是SortFields,因此需要在设置' fields‘属性之前进行检查:
private function compareEmptyAlwaysLast(a:Object, b:Object, fields:Array = null):int {
var result:int;
if (!ValidationHelper.hasData(a)) {
result = 1;
} else if (!ValidationHelper.hasData(b)) {
result = -1;
} else {
if (fields && fields.length > 0 && fields[0] is SortField) {
STATIC_SORT.fields = fields;
}
var f:Function = STATIC_SORT.compareFunction;
result = f.call(null,a,b,fields);
}
return result;
}https://stackoverflow.com/questions/1368122
复制相似问题