我使用Pivot.js库为我的数据创建数据透视图。该库使用jquery.dataTables显示最终的数据透视表。不幸的是,Pivot.js在排序时遇到空值问题。
当使用以下设置时,github-site可以很容易地看到错误:
过滤字段:恩格尔伍德
行标签字段: last_name
列标签字段: invoice_yyyy
汇总字段: billed_amount
然后,按“2010”列排序。结果如下所示。
似乎列被排序为字符串,因为某些行包含空值(逻辑上)并且用''填充。排序适用于包含每行值的完整列。列2010未完成且$ 90.10!< $ 850.00
如果不更改Pivot.js库中的代码,如何避免此错误? 谢谢。
答案 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实现,您应该可以自由地为您的应用程序修改它;但是,如果您不想修改它,则会留下两个可能不受欢迎的行为:
上进行,并且如您所见,将该列视为字母数字进行排序。NULLS LAST
方法(即,它们总是出现在表的末尾,而不管升序/降序排序顺序)。我的解决方案远不是最优雅的,但这是我的代码:
排序功能:
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;
});
希望它有所帮助!