Jquery Slickgrid电子表格插件数字排序
我有一个带过滤插件的slickgrid: 这有一个排序功能:Jquery Slickgrid电子表格插件数字排序,jquery,sorting,slickgrid,Jquery,Sorting,Slickgrid,我有一个带过滤插件的slickgrid: 这有一个排序功能: filterPlugin.onCommand.subscribe(function (e, args) { dataView.fastSort(args.column.field, args.command === "sort-asc"); }); 这对文本过滤非常有效,但我的大部分数据都是数字。当我过滤数字1到1000时,它排序为1、10、100等等 我在网上找到了一个数字排序函数,但它只是把数字按随机顺序混在一起 f
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");
}
});
如何实现数字排序?首先请注意,
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) {
....
在示例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);
}
});
这是比较器:
function comparer(a, b) {
var x = a[sortcol], y = b[sortcol];
return (x == y ? 0 : (x > y ? 1 : -1));
}
您不必担心比较器中的排序方向,DataView会处理这个问题。比较器是标准的javascript比较器(请参阅)。因此,如果数字存储为数字,则无需执行任何操作。但是,如果数字存储为文本,则需要将其转换为数字作为比较操作的一部分。感谢Ben提供有关排序的所有背景信息,非常感谢。我已经根据您的代码简化了我的代码,它可以很好地对字符串进行排序,但不能对数字进行排序。所以我假设问题是它们是字符串,不是数字。这很奇怪,因为我将它们以这种格式添加到dataview中
d[“linenum”]=I+1代码>,它给了我0、1、2等。即使使用此代码,它仍然将数字排序为文本,您能提供进一步的帮助吗,Ben<代码>函数比较器(a,b){var x=a[sortcol],y=b[sortcol];//如果是一个数字:if(!isNaN(parseFloat(x)){x=parseFloat(x);}if(!isNaN(parseFloat(y)){y=parseFloat(y);}返回(x==y?0:(x>y?1:-1))}
function comparer(a, b) {
var x = a[sortcol], y = b[sortcol];
return (x == y ? 0 : (x > y ? 1 : -1));
}