Cook's Crossfilter tutorial似乎以两种不同的方式完成结果;
首先通过通用属性定义维度,然后应用过滤器。
var delayDimension = cf.dimension(function(d) {return d.delay;});
delayDimension.filter(function(d) {return d > 0});
通过属性d.delay > 0
定义维度直接获取结果维度:
var isDelayedDimension = cf.dimension(function(d) {return d.delay > 0;});
我想知道这两种方法在性能方面有何不同。
通过特定属性直接定义维度与以更通用的方式定义维度然后应用特定过滤器在性能上是否存在差异?
最佳答案
这些例子有两个不同的目的。
第一个示例中的维度允许您按延迟量进行分组和过滤。
然后过滤器命令更新维度的过滤器,以便在整个交叉过滤器实例中,在返回行或聚合时仅使用具有一些延迟的航类。过滤命令是命令式的:它不会创建过滤后的新维度或返回过滤后的行,只是更改该维度的过滤属性并返回相同的维度。
第二个示例允许您按 bool 值“是否延迟”进行分组和过滤。它还不执行任何过滤。要获得与第一个示例中的过滤器命令等效的效果,您可以这样做
isDelayedDimension.filter(true);
同样,这会返回相同的维度,而不是新维度。它强制性地跨交叉过滤器实例过滤数据,以便其他维度和基于它们的组将不再看到任何未延误的航类。
如果这就是您想要做的全部,按航类是否延误进行过滤,那么我认为第二种方法应该稍微快一些,但可能不会有明显的差异。它不会改变算法的复杂性,但如果有 bool 值而不是整数值,它可能会使排序更容易一些。
如果出于某种原因你想显示聚合或排序的航类延误信息,并根据航类是否延误进行过滤,这将是使用第一种形式的一个原因:它可以做这两件事,你可以避免创建第二个维度。维度是最昂贵的交叉过滤器对象。
然而,a group does not observe its own dimension's filters ,因此如果您希望聚合延迟信息在您按“延迟”过滤时发生变化,您仍然需要使用二维。
关于javascript - 过滤后的交叉过滤器维度与按过滤属性定义维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829097/