2015-03-31 66 views
0

我对我的CrossFilter数据使用了一个基本的dc.js DataTable,并试图通过我的Value属性对它进行排序,这是一个数字,但我得到的数据是奇数排序。Crossfilter + dc.js DataTable没有正确排序

下面是一个的jsfiddle显示问题 - http://jsfiddle.net/DonalRafferty83/97mwyp0u/4/

设置我CrossFilter尺寸如下:

var ndx = crossfilter(data); 

var parseDate = d3.time.format("%d/%m/%Y").parse; 

data.forEach(function(d) { 
    d.date = parseDate(d.InDate); 
    d.Value = parseFloat(d.Value).toFixed(2); 
}); 

var dateDim = ndx.dimension(function(d) {return d.date;}); 
var typeDim = ndx.dimension(function(d) {return d.Type;}); 

然后我创建数据表如下:

var datatable = dc.dataTable("#dc-data-table"); 
datatable 
    .dimension(dateDim) 
    .group(function(d) {return "";}) 
    .size(data.length) 
    // dynamic columns creation using an array of closures 
    .columns([ 
     function(d) { return d.Id; }, 
     function(d) {return d.Indate;}, 
     function(d) {return d.Type;}, 
     function(d) {return d.Category;}, 
     function(d) {return d.Value;} 
    ]).sortBy(function(d) { 
     return d.Value; 
    }) 
    .order(d3.descending); 

这里是什么排序出来,因为你可以99在4000.46之前订购这是不正确的:

Incorrect ordering

这是CrossDilter/dc.js的一个已知问题吗?还是有什么我做错了?也许我需要操纵我的数据,使其以正确的方式工作?

回答

2

.toFixed(2)返回一个字符串,因此你的sortBy函数正在对一个字符串进行排序。因此,在“4000.46”之前订购“99”是正确的。切换您的sortBy功能到return +d.Value;(+强制转换回数字)应该可以解决您的问题。

一个固定版本的jsfiddle的:https://jsfiddle.net/j9adz6bs/

+0

感谢阮经天,令人震惊的是我错过了!但它正在工作,但是在我的真实数据集中超过了100k条记录,一个很小的数值隐藏在表的顶部,例如1.9出现在表的顶部,然后该值被正确排序,所以它的1.9然后是4000 3904等,我不能用假数据复制它,所以它是一个很长的镜头,但只是想知道你是否曾经看过类似的东西,并知道修复? – 2015-03-31 15:46:29

+0

你的日期维度中是否有null/undefined?这听起来像是当交叉过滤器维度值不是自然排序时可能发生的那种事情。 – 2015-03-31 17:39:35

+0

谢谢我将通过数据看看是否有像那样的东西 – 2015-03-31 17:42:53