Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Slickgrid电子表格插件数字排序_Jquery_Sorting_Slickgrid - Fatal编程技术网

Jquery 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

我有一个带过滤插件的slickgrid:

这有一个排序功能:

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