首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排序--编写一个定制的compareFunction?

排序--编写一个定制的compareFunction?
EN

Stack Overflow用户
提问于 2009-09-02 14:42:13
回答 4查看 22.4K关注 0票数 8

好的,我正在按字母顺序对XMLListCollection进行排序。不过,我有一个问题。如果值是"ALL“,我希望它在列表中排在第一位。在大多数情况下,这种情况已经发生了,但是作为数字的值被排序在"ALL“之前。我希望"ALL“始终是我的dataProvider中的第一个选项,然后是其余的字母顺序。

因此,我正在尝试编写自己的排序函数。有没有一种方法可以检查其中一个值是不是全部,如果不是,就告诉它对这些值进行常规比较?

这就是我所拥有的:

代码语言:javascript
复制
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;

对于我正在尝试做的事情,有什么解决方案吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-02 15:03:43

好吧,我尝试了一些东西,我真的很惊讶它真的起作用了,但这是我做的。

Sort类有一个名为internalCompare的私有函数。因为它是私有的,所以您不能调用它。但是有一个名为compareFunction的getter函数,如果没有定义比较函数,它将返回对internalCompare函数的引用。所以我所做的就是获取这个引用,然后调用它。

代码语言:javascript
复制
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);
}
票数 8
EN

Stack Overflow用户

发布于 2009-10-09 13:32:36

John Isaacks的解决方案很棒,但他忘记了“field”变量,并且他的示例不适用于更复杂的对象(除了String)。

示例:

代码语言:javascript
复制
// 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);
}
票数 14
EN

Stack Overflow用户

发布于 2010-05-14 22:55:46

谢谢你们,这帮了大忙了。在我们的例子中,我们需要底部的所有空行(在DataGrid中)。所有非空行都应该正常排序。我们的行数据都是动态对象(从JSON转换而来) --对ValidationHelper.hasData()的调用只是检查行是否为空。由于某些原因,这些字段有时包含dataField字符串值而不是SortFields,因此需要在设置' fields‘属性之前进行检查:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1368122

复制
相关文章

相似问题

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