Apache flex 我怎样才能浓缩这个?

Apache flex 我怎样才能浓缩这个?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我有多个数据网格,总共大约有10-15列。我对每一列都有一个数字排序比较。目前,我对每个排序比较都有一个单独的函数…每个排序都是数字排序。我猜我可以将函数sort1、sort2、sort3等压缩为一个函数,但我不知道如何: private function sort1(obj1:Object, obj2:Object):int{ var value1:Number=(obj1.zip==''||obj1.zip==null)?null:new Number(obj1.zip); var valu

我有多个数据网格,总共大约有10-15列。我对每一列都有一个数字排序比较。目前,我对每个排序比较都有一个单独的函数…每个排序都是数字排序。我猜我可以将函数sort1、sort2、sort3等压缩为一个函数,但我不知道如何:

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

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

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");

空检查和空检查是不必要的,因为
Number()
会自动将它们转换为0。

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

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");

空检查和空检查是不必要的,因为
Number()
会自动将它们转换为0。

这将有助于简化代码:

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');
}

这是我过去使用的方法。不幸的是,在SortComparennction中,无法访问被单击的列以获取dataField属性。

这将有助于简化代码:

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');
}

这是我过去使用的方法。不幸的是,在SortComparennction中,无法访问被单击的列以获取dataField属性。

+1因为我喜欢这种方法的创造性。我一直担心使用匿名函数会损害代码的可读性/可维护性,尽管如此。非常好。Thx也适用于Flextras+1,因为我喜欢这种方法的创造性。我一直担心使用匿名函数会损害代码的可读性/可维护性,尽管如此。非常好。Thx也适用于Flextras