我的数据如下:
var ndx = crossfilter(data); // init crossfilter
// create dimension based on category
var categoryDimension = ndx.dimension(
function (d) {
return d.category;
}
);
// Group by category
var categoryGroup = categoryDimension.group();
var categoryCount = dc.numberDisplay('#category-count'); // An empty span
categoryCount
.group(categoryGroup)
.valueAccessor(
function (d) { return d.value; }
);
我想创建一个dc.numberDisplay,显示上面示例数据(A,B和C)中唯一类别数量的计数 3。
这就是我目前正在做的事情:
d
问题是numberDisplay显示 2 而不是3.调试时,我发现当调用valueAccessor时,const categoryDimension = claims.dimension(
(d) => {
return d.cat;
}
);
const categoryGroup = categoryDimension.groupAll().reduce(
(p, v) => { // add element
const cat = v.cat;
const count = p.categories.get(cat) || 0;
p.categories.set(cat, count + 1);
return p;
},
(p, v) => { // remove element
const cat = v.cat;
const count = p.categories.get(cat);
if (count === 1) {
p.categories.delete(cat);
} else {
p.categories.set(cat, count - 1);
}
return p;
},
() => { // init
return {
categories: new Map()
};
});
categoryCount
.group(categoryGroup)
.valueAccessor(
(d) => {
return d.categories.size;
}
);
是A类元素数量的计数而不是类别数量的计数。
我该如何解决这个问题?
更新:感谢Nathan的解决方案,这是一个有效的代码片段(ES2016风格)
gsutil hash your-local-file
答案 0 :(得分:5)
您需要使用groupAll(),因为数字显示仅查看顶部组。然后提供自定义缩减功能以跟踪唯一类别。最后,当DC.js从顶部组中拉出值时(只有一个) - 只返回类别数(即p对象中的键数)。
var categoryGroup = categoryDimension.groupAll().reduce(
function (p, v) { //add
if(p[v.cat]) {
p[v.cat]++;
} else {
p[v.cat] = 1;
}
return p;
},
function (p, v) { //remove
p[v.cat]--;
if(p[v.cat] === 0) {
delete p[v.cat];
}
return p;
},
function () { //init
//initial p - only one since using groupAll
return {};
}
);
console.debug("groups", categoryGroup.value());
dc.numberDisplay('#category-count')
.group(categoryGroup)
.valueAccessor(
function (d) { return Object.keys(d).length; }
);