我正在将基本dc.js DataTable与我的CrossFilter数据一起使用,并尝试通过我的Value属性(它是一个数字)对它进行排序,但是我得到的数据是奇数排序的。
这是显示问题的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;});
然后,按如下所示创建DataTable:
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);
这是排序的结果,因为您可以在4000.46之前订购99,这是不正确的:
这是CrossDilter / dc.js的已知问题吗?还是我做错了什么?也许我需要操纵我的数据以使其以正确的方式工作?
.toFixed(2)
返回一个字符串,因此您的sortBy函数正在对字符串进行排序。因此,在“ 4000.46”之前订购“ 99”是正确的。将您的sortBy函数切换为return +d.Value;
(+会强制转换回数字)应该可以解决您的问题。
JSFiddle的固定版本:https ://jsfiddle.net/j9adz6bs/
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句