如何使用pivot.js对空值进行排序

时间:2013-02-19 13:43:52

标签: javascript jquery pivot

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

当使用以下设置时,github-site可以很容易地看到错误:

  

过滤字段:恩格尔伍德

     

行标签字段: last_name

     

列标签字段: invoice_yyyy

     

汇总字段: billed_amount

然后,按“2010”列排序。结果如下所示。 Example Sorting Error

似乎列被排序为字符串,因为某些行包含空值(逻辑上)并且用''填充。排序适用于包含每行值的完整列。列2010未完成且$ 90.10!< $ 850.00

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

1 个答案:

答案 0 :(得分:1)

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

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

  1. dataTables的自动类型检测在 上进行,并且如您所见,将该列视为字母数字进行排序。
  2. 即使您检测到数字排序,通常也会将空值视为集合的最小值或最大值。在我的应用程序中,我更喜欢NULLS LAST方法(即,它们总是出现在表的末尾,而不管升序/降序排序顺序)。
  3. 我的解决方案远不是最优雅的,但这是我的代码:

    排序功能:

    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
        "formatted-num-pre": function ( a ) {
            a = (a===' ') ? 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===' ')?'formatted-num':null; 
      });
    

    希望它有所帮助!