javascript - 在 crossfilter.js 中按多个维度排序

标签 javascript sorting crossfilter

我正在使用 Mike Bostock 的 crossfilter用于过滤和排序大型数据集的库。我的问题:给定一个具有多个维度的数据集,我如何一次对多个维度进行排序?

Example JSFiddle

测试数据集:

[
    { cat: "A", val:1 },
    { cat: "B", val:2 },
    { cat: "A", val:11 },
    { cat: "B", val:5 },
    { cat: "A", val:3 },
    { cat: "B", val:2 },
    { cat: "A", val:11 },
    { cat: "B", val:100 }
]

所需输出的示例,按 cat, val(升序)排序:

[
    { cat: "A", val:1 },
    { cat: "A", val:3 },
    { cat: "A", val:11 },
    { cat: "A", val:11 },
    { cat: "B", val:2 },
    { cat: "B", val:2 },
    { cat: "B", val:5 },
    { cat: "B", val:100 }
]

到目前为止我使用的方法是在所需维度上使用字符串连接:

var combos = cf.dimension(function(d) { return d.cat + '|' + d.val; });

这适用于多个基于字符串的维度,但不适用于数字维度,因为它不是自然排序 ('4' > '11' )。我想我可以在数字上使用零填充来完成这项工作,但这对于大型数据集来说可能会变得昂贵,所以我宁愿避免它。 这里还有其他可行的方法吗,使用交叉过滤器?

任何允许不同维度具有不同排序方向(升序/降序)的解决方案的加分点。

澄清:是的,我可能需要切换到 native Array.sort 实现。但使用 crossfilter 的全部意义在于它非常非常快,尤其是对于大型数据集,并且它以一种使重复排序更快的方式缓存排序顺序。所以我真的在这里寻找基于交叉过滤器的答案。

最佳答案

我知道它没有使用 crossfilter 库,但为什么不使用 sort 函数来执行此操作?

var combos = cf.sort(function(a,b) { 
   if(a.cat == b.cat) return a.val < b.val ? -1 : 1;
   return a.cat < b.cat ? -1 : 1;
});

参见 http://jsfiddle.net/cQXNK/5/

要允许不同的维度有不同的排序方向,只需将 -1 换成 1,反之亦然

关于javascript - 在 crossfilter.js 中按多个维度排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245016/

相关文章:

javascript - d3js(+crossfilter/dc)箱线图性能

javascript - 使用 dc.js 进行简单列表过滤器和搜索过滤器?

javascript - 我想将可更改的数据存储在表行的一列中

jquery - 根据屏幕大小对 div 进行排序

wpf - 禁用对 WPF MVVM 中 DataGrid 中自动生成的列进行排序

java - 如何查找字符串中字符之间的最长距离

javascript - 使用 dc.js 的均匀间隔的直方图 bins?

javascript - React JS根据浏览器不活动删除cookie

javascript - 如何处理 textarea 中的 <tab>?

javascript - 为什么我的音节被取回,但我的单词却没有被取回?