我有一个带有这个过滤插件的slickgrid:
https://github.com/danny-sg/slickgrid-spreadsheet-plugins/blob/master/ext.headerfilter.js
这有一个排序功能:
filterPlugin.onCommand.subscribe(function (e, args) {
dataView.fastSort(args.column.field, args.command === "sort-asc");
});
这适用于文本过滤,但我的大多数数据都是数字。当我将数字1过滤到1000时,它将分类为1,10,100等。
我有一个数字排序功能,我在网上找到它,但它只是按随机顺序混乱数字。
function NumericSorter(a, b) {
var x = a[sortcol], y = b[sortcol];
return sortdir * (x == y ? 0 : (x > y ? 1 : -1));
}
我认为这个问题是因为它设计用于内置的slickgrid点击排序功能,所以我需要调整它以使用电子表格排序,但我不理解排序功能足够做此
到目前为止,这是我的代码:
filterPlugin.onCommand.subscribe(function (e, args) {
dataView.fastSort(args.column.field, args.command === "sort-asc");
//MD added
if (args.column.field == "linenum") {
dataView.sort(NumericSorter, args.sortAsc);
// alert("numeric sort");
} else {
dataView.fastSort(args.column.field, args.command === "sort-asc");
// alert("text sort");
}
});
如何实现数字排序?
答案 0 :(得分:1)
首先请注意fastSort
是IE9之前的解决方法,除非您想支持IE9之前的版本,否则不需要使用它。
/***
* Provides a workaround for the extremely slow sorting in IE.
* Does a [lexicographic] sort on a give column by temporarily overriding Object.prototype.toString
* to return the value of that field and then doing a native Array.sort().
*/
function fastSort(field, ascending) {
....
在Example-4-model中,使用以下排序代码。
grid.onSort.subscribe(function (e, args) {
sortdir = args.sortAsc ? 1 : -1;
sortcol = args.sortCol.field;
if (isIEPreVer9()) {
// using temporary Object.prototype.toString override
// more limited and does lexicographic sort only by default, but can be much faster
var percentCompleteValueFn = function () {
var val = this["percentComplete"];
if (val < 10) {
return "00" + val;
} else if (val < 100) {
return "0" + val;
} else {
return val;
}
};
// use numeric sort of % and lexicographic for everything else
dataView.fastSort((sortcol == "percentComplete") ? percentCompleteValueFn : sortcol, args.sortAsc);
} else {
// using native sort with comparer
// preferred method but can be very slow in IE with huge datasets
dataView.sort(comparer, args.sortAsc);
}
});
请注意,所有奇特的逻辑(包括sortcol
变量)都是针对IE8或更低版本的解决方法,其他浏览器基本上需要一行代码:
grid.onSort.subscribe(function (e, args) {
dataView.sort(comparer, args.sortAsc);
});
这是比较器:
function comparer(a, b) {
var x = a[sortcol], y = b[sortcol];
return (x == y ? 0 : (x > y ? 1 : -1));
}
您不必担心比较器中的排序方向 - DataView负责这一点。比较器是标准的javascript比较器(参见here) 因此,如果数字存储为数字,则您不需要做任何事情。但是,如果数字存储为文本,则需要将它们转换为数字,作为比较操作的一部分。