使用以下数据:
const now = new Date
const data = [
{ player: 'bob', color: 'blue', date: new Date(+now + 1000) },
{ player: 'bill', color: 'green', date: new Date(+now + 2000) },
{ player: 'bob', color: 'red', date: new Date(+now + 3000) },
{ player: 'barbara', color: 'blue', date: new Date(+now + 4000) },
{ player: 'barbara', color: 'cyan', date: new Date(+now + 8000) },
{ player: 'barbara', color: 'magenta', date: new Date(+now + 10000) },
{ player: 'barbara', color: 'yellow', date: new Date(+now + 20000) },
]
我想在颜色维度上减少颜色,但仅计算每个玩家的第一个颜色。 (注意:首先是w.r.t.可以过滤的日期维度。)我一直试图使用异常功能使用reductio但是它没有给出预期的结果:
reducer = reductio()
reducer.exception('player').exceptionCount(true)
reducer(colorGroup)
结果应如下所示:
blue,2 # bob and barbara
cyan,0
green,1 # bill
magenta,0
red,0
yellow,0
另一个示例,将日期维度过滤为now+2100
.. now+20000
(即过滤掉第一行):
blue,1 # barbara
cyan,0
green,0 # (bill's first color is not counted because it is outside the date range)
magenta,0
red,1 # bob (blue is his first color overall, red is his first in this date range)
yellow,0
注意:我有其他使用所有行的分组,因此我无法在将列表加载到crossfilter之前对其进行预过滤。
有没有办法为此使用reductio()?或者一些如何做到这一点的例子"分组和#34;用crossfilter直接?
修改
链接到jsfiddle显示意外结果:https://jsfiddle.net/qt5jxjm1/
答案 0 :(得分:2)
我不确定crossfilter是否会在这里对你有所帮助 - 它并没有真正考虑到值的顺序,而且它肯定没有办法按一个键排序然后另一个人。
这是一个假的小组,它会接近您想要的,通过使用另一个维度进行排序,以及一组用于组密钥的访问者和第一个字段",即您想要的字段寻找第一个:
function double_reduce(dim, groupf, firstf) {
return {
all: function() {
var recs = dim.bottom(Infinity);
var hit = {}, bins = {};
recs.forEach(function(r) {
var fkey = firstf(r), gkey = groupf(r);
var count = hit[fkey] ? 0 : 1;
hit[fkey] = true;
bins[gkey] = (bins[gkey] || 0) + count;
});
return Object.keys(bins).map(function(k) {
return {key: k, value: bins[k]};
});
}
}
}
像这样使用:
var dubred_group = double_reduce(dateDim,
function(r) { return r.color;}, function(r) { return r.player; });
这不能做的就是为过滤掉的任何值提供零。通常,crossfilter会增量添加和删除,我不知道这是如何实现的。
所以没有任何过滤日期的结果看起来不错:
[
{
"key": "blue",
"value": 2
},
{
"key": "green",
"value": 1
},
{
"key": "red",
"value": 0
},
{
"key": "cyan",
"value": 0
},
{
"key": "magenta",
"value": 0
},
{
"key": "yellow",
"value": 0
}
]
但过滤后的案例中缺少一个bin,因为绿色不会出现在过滤后的数据中:
[
{
"key": "red",
"value": 1
},
{
"key": "blue",
"value": 1
},
{
"key": "cyan",
"value": 0
},
{
"key": "magenta",
"value": 0
},
{
"key": "yellow",
"value": 0
}
]
这可能是固定的,但我想我会发布此信息以获得反馈。