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

问题描述:

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

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

筛选字段:恩格尔伍德

行标签字段:姓氏

列标签字段: invoice_yyyy

摘要字段: billed_amount

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

似乎该列被排序得像一个字符串,因为某些行包含空值(逻辑上)并填充为''。排序适用于在每行中包含值的完整列。 2010年专栏不完整,90.10美元! < $ 850.00

如何在不改变Pivot.js库中的代码的情况下避免该错误? 谢谢。

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

这里棘手的一点是,jquery_pivot。 js(与pivot.js一起发布)使用非空格空间点(&nbsp;)作为空值(https://github.com/rjackson/pivot.js/blob/master/jquery_pivot.js#L347)。我建议jquery_pivot.js只是一个建议的UI实现,您应该可以自由修改它以适应您的应用程序;但是,如果你不想修改它,你留下两个潜在的不良行为:

  1. 数据表自动在&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; 
    }); 

希望它能帮助!