首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataGrid --根据自己的值对列进行排序,然后根据其他列的值进行排序?

DataGrid --根据自己的值对列进行排序,然后根据其他列的值进行排序?
EN

Stack Overflow用户
提问于 2013-08-26 14:16:28
回答 4查看 1.2K关注 0票数 0

我有一个包含两列的AdvancedDatagrid :代码(字符串)和值(数字)。我对每一列使用相同的排序函数。我想要做的是根据值列(数值数据)对这两列进行排序,但是如果没有可用的数字,我希望按字母顺序对Code列进行排序。

我以一个例子简化了我所面临的问题,以说明我所要做的事情:

图显示了这两列,并根据Value列对两列进行了排序。如果值为NaN,我希望按字母顺序对代码列值进行排序。所以1,2,3,4将保持不变,但BADC将是ABCD。

代码语言:javascript
复制
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
                layout="absolute" minWidth="955" minHeight="600" initialize="initializeHandler(event)">

    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import mx.utils.ObjectUtil;

            [Bindable]
            private var ac:ArrayCollection;

            protected function initializeHandler(event:FlexEvent):void
            {
                ac = new ArrayCollection();

                var one:NameValueObject = new NameValueObject("One", 1);
                var two:NameValueObject = new NameValueObject("Two", 2);
                var three:NameValueObject = new NameValueObject("Three", 3);
                var four:NameValueObject = new NameValueObject("Four", 4);
                var a:NameValueObject = new NameValueObject("A", NaN);
                var b:NameValueObject = new NameValueObject("B", NaN);
                var c:NameValueObject = new NameValueObject("C", NaN);
                var d:NameValueObject = new NameValueObject("D", NaN);

                ac.addItem(one);
                ac.addItem(two);
                ac.addItem(three);
                ac.addItem(four);
                ac.addItem(b);
                ac.addItem(a);
                ac.addItem(d);
                ac.addItem(c);              
            }

            private function numericValueSort(obj1:Object, obj2:Object):int
            {
                var value1:Number = (obj1 as NameValueObject).value;
                var value2:Number = (obj2 as NameValueObject).value;

                return ObjectUtil.numericCompare(value1, value2);
            }

            private function codeLabelFunction(item:Object, column:AdvancedDataGridColumn):String
            {
                return (item as NameValueObject).code;
            }

        ]]>
    </mx:Script>

    <mx:AdvancedDataGrid width="500" height="300" dataProvider="{ac}">
        <mx:columns>
            <mx:AdvancedDataGridColumn id="codeColumn" 
                                       headerText="Code"
                                       dataField="value"
                                       labelFunction="codeLabelFunction"
                                       sortCompareFunction="numericValueSort">

            </mx:AdvancedDataGridColumn>
            <mx:AdvancedDataGridColumn id="numericValueColumn" 
                                       headerText="Value"
                                       dataField="value"
                                       sortCompareFunction="numericValueSort">

            </mx:AdvancedDataGridColumn>
        </mx:columns>
    </mx:AdvancedDataGrid>
</mx:Application>

NaveValueObject类

代码语言:javascript
复制
package
{
    public class NameValueObject
    {
        public var code:String;
        public var value:Number;

        public function NameValueObject(aCode:String, aNumber:Number)
        {
            code = aCode;
            value = aNumber;
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-27 09:17:05

我想明白了,这就是我最后使用的sortCompareFunction:

它检查值/s无效的3种可能条件。如果唯一的一个是NaN,则返回1或-1,否则将根据代码列进行排序。

如果这两个值都是有效的(而不是NaN),是否进行regualar比较:

代码语言:javascript
复制
private function numericValueSort(obj1:Object, obj2:Object):int
{
    var o1:NameValueObject = obj1 as NameValueObject;
    var o2:NameValueObject = obj2 as NameValueObject;

    if( isNaN(o1.value) && !isNaN(o2.value) ){
        return 1; // o1 appears after o2;
    }
    if( !isNaN(o1.value) && isNaN(o2.value) ){
        return -1; // o1 appears before o2
    }
    if( isNaN(o1.value) && isNaN(o2.value) ){
            // Both values are NaN, so they will have been placed 
            // at the end when compared with valid values (from previous two 
            // IF statements, but now to compare to each other, we sort using the 
            // code field
        return ObjectUtil.stringCompare(o1.code, o2.code);
    }
    // If neither value is NaN, then do a regular numeric compare
    return ObjectUtil.numericCompare(o1.value, o2.value);
}

票数 0
EN

Stack Overflow用户

发布于 2013-08-26 15:12:43

试试这个:

代码语言:javascript
复制
private function numericValueSort(obj1:Object, obj2:Object):int
{
    var o1:NameValueObject = obj1 as NameValueObject;
    var o2:NameValueObject = obj2 as NameValueObject;

    var ret:int = 0;
    if (isNaN(o1.value) || isNaN(o2.value)) {
        if (o1.code > o2.code) {
            ret = 1;
        } else if (o1.code < o2.code){
            ret = -1;
        }
    } else {
        ret = ObjectUtil.numericCompare(o1.value, o2.value);
    }
    return ret;
}

您的函数进程号要么是值的,也是比较两个对象的代码字段的。

票数 1
EN

Stack Overflow用户

发布于 2013-08-26 20:14:04

下面的比较函数将优先处理数值,并根据代码对NaN值进行排序。这种方法是为每个对象组合一个新的字符串,并在字符串前面加上一个指示优先级的值(A > B):

代码语言:javascript
复制
private function numericValueSort(obj1:NameValueObject, obj2:NameValueObject):int {
  var a:String = (isNaN(obj1.value) ? "B" : "A") + obj1.value + obj1.code;
  var b:String = (isNaN(obj2.value) ? "B" : "A") + obj2.value + obj2.code;
  return ObjectUtil.stringCompare(a, b);
}

请注意,例如,在排序1、2、11时,这可能会产生奇怪的结果。在这种情况下,最好使用自然比较。在ActionScript Lang库中有一个AS3Commons免疫系统。

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

https://stackoverflow.com/questions/18446311

复制
相关文章

相似问题

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