javascript - Crossfilter + dc.js DataTable 未正确排序

标签 javascript datatable dc.js crossfilter

我将基本的 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;});

然后我创建数据表,如下所示:

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,这是不正确的:

Incorrect ordering

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

最佳答案

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

JSFiddle 的修复版本:https://jsfiddle.net/j9adz6bs/

关于javascript - Crossfilter + dc.js DataTable 未正确排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29366872/

相关文章:

javascript - 将变量从 ASP.net 传递到 JavaScript

javascript - 为什么相同的javascript可以使用runscript命令运行,但不能在RC中的getEval中运行

jsf - 如何更改默认 p :dataTable emptyMessage message

javascript - 向下滑动垂直菜单而不从子菜单水平插入

javascript - jasmine如何比较复杂的对象和数组

PowerShell 函数不会返回 DataTable

javascript - 禁用排序数据表

javascript - D3.js 获取面积图最近的 X 和 Y 坐标

javascript - 如何在 dc.js 数据表中进行分组?

sum - 在 dc.js 中创建运行总和图