gpt4 book ai didi

javascript - crossfilter:如何同时对开始日期和结束日期列使用交叉过滤器

转载 作者:行者123 更新时间:2023-11-29 19:16:08 26 4
gpt4 key购买 nike

我的情况与此 question 类似.考虑到相同的数据集,我如何通过交叉过滤器执行此功能。我是 dc.js 和 crossfilter 的新手。我正在尝试执行此 example 中的条形图和面积图.即使是这个例子也使用了 1 个日期列。我只能用开始日期来做。但是,我的要求是根据开始日期和结束日期过滤数据集。我找不到许多讨论同一问题的资源。

我们将不胜感激任何帮助和建议。

最佳答案

您可能认为这很简单,但实际上跟踪间隔是计算机科学的经典棘手问题之一,它需要一种称为 interval tree 的专门数据结构。正确地做到这一点。

这是一个很常见的请求,出于好奇,我寻找了一个用于区间树和 found one by Mikola Lysenko 的 JavaScript 库。 .

我已将其合并到 new example here 中. ( source )

示例的重要部分首先是使用groupAll 来填充区间树:

      projectsPerMonthTree = ndx.groupAll().reduce(
function(v, d) {
v.insert(d.interval);
return v;
},
function(v, d) {
v.remove(d.interval);
return v;
},
function() {
return lysenkoIntervalTree(null);
}
)

接下来我们使用开始和结束日期填充一个假组,计算与每个月相交的所有间隔:

  function intervalTreeGroup(tree, firstDate, lastDate) {
return {
all: function() {
var begin = d3.time.month(firstDate), end = d3.time.month(lastDate);
var i = new Date(begin);
var ret = [], count;
do {
next = new Date(i);
next.setMonth(next.getMonth()+1);
count = 0;
tree.queryInterval(i.getTime(), next.getTime(), function() {
++count;
});
ret.push({key: i, value: count});
i = next;
}
while(i.getTime() <= end.getTime());
return ret;
}
};
}

projectsPerMonthGroup = intervalTreeGroup(projectsPerMonthTree.value(), firstDate, lastDate),

(如果我们使用较低级别的区间树访问,或者如果它有更丰富的 API 允许按顺序遍历区间,这可能会更简单和更便宜。但这应该足够快。)

最后,我们设置了一个filterFunction,以便我们选择与给定日期范围相交的间隔:

  monthChart.filterHandler(function(dim, filters) {
if(filters && filters.length) {
if(filters.length !== 1)
throw new Error('not expecting more than one range filter');
var range = filters[0];
dim.filterFunction(function(i) {
return !(i[1] < range[0].getTime() || i[0] > range[1].getTime());
})
}
else dim.filterAll();
return filters;
});

我已将其设置为过滤月份图表以显示与其自身日期范围相交的所有项目。如果不需要,可以将 groupAll 放在 intervalDimension 上。

关于javascript - crossfilter:如何同时对开始日期和结束日期列使用交叉过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35221270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com