Slickgrid电子表格插件数字排序

时间:2017-09-20 05:29:45

标签: jquery sorting slickgrid

我有一个带有这个过滤插件的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");
    }
 });

如何实现数字排序?

1 个答案:

答案 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) 因此,如果数字存储为数字,则您不需要做任何事情。但是,如果数字存储为文本,则需要将它们转换为数字,作为比较操作的一部分。