在 AS3 中跨 DataGridColumns 重用 sortCompareFunction
Reuse sortCompareFunction across DataGridColumns in AS3
我使用以下函数组合了一个 DataGrid
public function get dataGridColumns():Array {
var dataGridColumnArray:Array = [];
dataGridColumnArray.push(createDataGridColumn(col1, "field1", 0.17, sortStrings));
dataGridColumnArray.push(createDataGridColumn(col2, "field2", 0.17, sortStrings));
dataGridColumnArray.push(createDataGridColumn(col3, "field3", 0.17, sortStrings));
return dataGridColumnArray;
}
private static function createDataGridColumn(columnName:String, dataField:String, width:Number,sortCompareFunction:Function = null):DataGridColumn {
var column:DataGridColumn = new DataGridColumn(columnName);
column.dataField = dataField;
column.width = width;
column.sortCompareFunction = sortCompareFunction;
return column
}
private function sortStrings(a:Object, b:Object, fields:Array = null):int{
if(a.toString().toLowerCase() > b.toString().toLowerCase()){
return 1;
}else if(a.toString().toLowerCase() < b.toString().toLowerCase()){
return -1;
}else{
return 0;
}
}
因为我的dataProvider是一个数据数组objects我运行进入排序函数中的a和b是objects的问题,我想以某种方式通过将数据字段(列标题)放入排序中,这样我就可以使用一个排序函数检查正确的 object 属性,因此它看起来像:
private function sortStrings(a:Object, b:Object, field:String):int{
if(a.field.toLowerCase() > b.field.toString().toLowerCase()){
return 1;
}else if(a.field.toString().toLowerCase() < b.field.toString().toLowerCase()){
return -1;
}else{
return 0;
}
}
我还没有想出一个好的方法来做到这一点,最坏的情况是我有 6 个极其相似的排序函数。
您可以创建一个比较器工厂函数,它将 return 闭包,包含字段名称:
private function createComparatorFor(field:String):Function {
return function (a:Object, b:Object, fields:Array = null):int{
const aField:String = a[field].toString().toLowerCase();
const bField:String = b[field].toString().toLowerCase();
if (aField > bField) {
return 1;
}
if (aField < bField) {
return -1;
}
return 0;
}
}
并像这样使用它:
dataGridColumnArray.push(createDataGridColumn(
col1, "field1", 0.17, createComparatorFor("field1")));
未经测试,但应该可以工作
我使用以下函数组合了一个 DataGrid
public function get dataGridColumns():Array {
var dataGridColumnArray:Array = [];
dataGridColumnArray.push(createDataGridColumn(col1, "field1", 0.17, sortStrings));
dataGridColumnArray.push(createDataGridColumn(col2, "field2", 0.17, sortStrings));
dataGridColumnArray.push(createDataGridColumn(col3, "field3", 0.17, sortStrings));
return dataGridColumnArray;
}
private static function createDataGridColumn(columnName:String, dataField:String, width:Number,sortCompareFunction:Function = null):DataGridColumn {
var column:DataGridColumn = new DataGridColumn(columnName);
column.dataField = dataField;
column.width = width;
column.sortCompareFunction = sortCompareFunction;
return column
}
private function sortStrings(a:Object, b:Object, fields:Array = null):int{
if(a.toString().toLowerCase() > b.toString().toLowerCase()){
return 1;
}else if(a.toString().toLowerCase() < b.toString().toLowerCase()){
return -1;
}else{
return 0;
}
}
因为我的dataProvider是一个数据数组objects我运行进入排序函数中的a和b是objects的问题,我想以某种方式通过将数据字段(列标题)放入排序中,这样我就可以使用一个排序函数检查正确的 object 属性,因此它看起来像:
private function sortStrings(a:Object, b:Object, field:String):int{
if(a.field.toLowerCase() > b.field.toString().toLowerCase()){
return 1;
}else if(a.field.toString().toLowerCase() < b.field.toString().toLowerCase()){
return -1;
}else{
return 0;
}
}
我还没有想出一个好的方法来做到这一点,最坏的情况是我有 6 个极其相似的排序函数。
您可以创建一个比较器工厂函数,它将 return 闭包,包含字段名称:
private function createComparatorFor(field:String):Function {
return function (a:Object, b:Object, fields:Array = null):int{
const aField:String = a[field].toString().toLowerCase();
const bField:String = b[field].toString().toLowerCase();
if (aField > bField) {
return 1;
}
if (aField < bField) {
return -1;
}
return 0;
}
}
并像这样使用它:
dataGridColumnArray.push(createDataGridColumn(
col1, "field1", 0.17, createComparatorFor("field1")));
未经测试,但应该可以工作