我正在使用 Mike Bostock 的crossfilter库来过滤和排序大型数据集。我的问题:给定一个具有多个维度的数据集,我如何一次对多个维度进行排序?
测试数据集:
[
{ 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'
)。我想我可以在数字上使用零填充来完成这项工作,但这对于大型数据集来说可能会变得昂贵,所以我宁愿避免它。有没有另一种方法可以在这里工作,使用交叉过滤器?
任何允许不同维度具有不同排序方向(升序/降序)的解决方案的奖励积分。
澄清:是的,我可能需要切换到本机Array.sort
实现。但是使用 crossfilter 的全部意义在于它非常非常快,尤其是对于大型数据集,并且它以一种使重复排序更快的方式缓存排序顺序。所以我真的在这里寻找基于交叉过滤器的答案。