2011-08-30 59 views
1

我有多个数据网格总共约10-15列。我有一个数字sortCompareFunction为每列。目前,我为每个排序比较我有一个单独的函数....每个都进行数字排序。我猜我可能凝结功能SORT1,SORT2,sort3等成1层的功能,但我无法弄清楚如何:我该如何压缩这个?

private function sort1(obj1:Object, obj2:Object):int{ 
var value1:Number=(obj1.zip==''||obj1.zip==null)?null:new Number(obj1.zip); 
var value2:Number=(obj2.zip==''||obj2.zip==null)?null:new Number(obj2.zip); 
return ObjectUtil.numericCompare(value1, value2); 
} 
private function sort2(obj1:Object, obj2:Object):int{ 
var value1:Number=(obj1.somenumbers==''||obj1.somenumbers==null)?null:new Number(obj1.somenumbers); 
var value2:Number=(obj2.somenumbers==''||obj2.somenumbers==null)?null:new Number(obj2.somenumbers); 
return ObjectUtil.numericCompare(value1, value2); 
} 
private function sort3(obj1:Object, obj2:Object):int{ 
var value1:Number=(obj1.morenumbers==''||obj1.morenumbers==null)?null:new Number(obj1.morenumbers); 
var value2:Number=(obj2.morenumbers==''||obj2.morenumbers==null)?null:new Number(obj2.morenumbers); 
return ObjectUtil.numericCompare(value1, value2); 
} 

...and on and on 

回答

4

一种方法是创建一个函数来创建比较功能:

private function createCompareFunc(propertyName:String):Function { 
    return function(obj1:Object, obj2:Object):int { 
     return ObjectUtil.numericCompare(Number(obj1[propertyName]), 
     Number(obj2[propertyName])); 
    } 
} 

然后设定比较功能像这样为每列:

dataGridColumn1.sortCompareFunction = createCompareFunc("property1"); 

空和空的检查是不必要的,因为​​自动转换那些为0。

+0

+1因为我喜欢这种方法的创造性。不过,我总是担心使用匿名函数会损害代码的可读性/可维护性。 – JeffryHouser

+0

很好。 Thx也给Flextras –

1

这将有助于简化您的代码位:

private function genericSort(obj1:Object, obj2:Object,column:String):int{ 
var value1:Number=(obj1[column]==''||obj1[column]==null)?null:new Number(obj1[column]); 
var value2:Number=(obj2[column]==''||obj2[column]==null)?null:new Number(obj2[column]); 
return ObjectUtil.numericCompare(value1, value2); 
} 

private function sort1(obj1:Object, obj2:Object):int{ 
return genericSort(obj1, obj2, 'zip'); 
} 
private function sort2(obj1:Object, obj2:Object):int{ 
return genericSort(obj1, obj2, 'someNumbers'); 
} 
private function sort3(obj1:Object, obj2:Object):int{ 
return genericSort(obj1, obj2, 'moreNumbers'); 
} 

而且这是我在过去使用的方法。不幸的是,在sortCompareFunction中,没有办法访问被点击的列来获取dataField属性。