0

我使用Pivot.js库在我的数据上创建透视视图。该库使用 jquery.dataTables 来显示最终的数据透视表。不幸的是,Pivot.js 在排序时存在空值问题。

当使用以下设置时,可以在github-site上轻松看到该错误:

过滤字段: Englewood

行标签字段: last_name

列标签字段: invoice_yyyy

汇总字段: billed_amount

然后,按“2010”列排序。结果将如下所示。 示例排序错误

似乎该列像字符串一样排序,因为某些行包含空值(逻辑上)并用“”填充。排序适用于每行包含一个值的完整列。2010 年的栏目不完整且 $90.10 !< $850.00

如果不更改 Pivot.js 库中的代码,如何避免此错误?谢谢你。

4

1 回答 1

1

您需要为数据表提供一组新的排序函数,然后添加一个aTypes函数来自动分配相应的数据类型(例如格式化数字) - http://datatables.net/release-datatables/examples/plug-ins/排序插件.html

这里的棘手之处在于 jquery_pivot.js(与 pivot.js 一起提供)使用不间断空格点 ( &nbsp;) 表示空值(https://github.com/rjackson/pivot.js/blob/master/jquery_pivot.js #L347)。我建议 jquery_pivot.js 只是一个建议的 UI 实现,您应该可以为您的应用程序自由修改它;但是,如果您不想修改它,则会留下两种可能不受欢迎的行为:

  1. 如您所见,dataTables 的自动类型检测会遍历&nbsp;并且将列视为字母数字进行排序。
  2. 即使您使用它来检测数字排序,空值通常也会被视为集合中的最小值或最大值。在我的应用程序中,我更喜欢这种NULLS LAST方法(即,无论升序/降序排序如何,它们总是出现在表格的末尾)。

我的解决方案远非最优雅的,但这是我的代码:

排序功能:

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
    "formatted-num-pre": function ( a ) {
        a = (a==='&nbsp;') ? NaN : a.replace( /[^\d\-\.]/g, "" );
        return parseFloat( a );
    },
    "formatted-num-asc": function ( a, b ) {
        if(isNaN(a)) return 1;
        if(isNaN(b)) return -1;
        return a-b;
    },
    "formatted-num-desc": function ( a, b ) {
        if(isNaN(a)) return 1;
        if(isNaN(b)) return -1;
        return b-a;
    }});

类型检测:

jQuery.fn.dataTableExt.aTypes.unshift(
  function (data) { 
    return (data.charAt(0)==='$'||data==='&nbsp;')?'formatted-num':null; 
  });

希望能帮助到你!

于 2013-07-15T15:37:32.173 回答