dc.numberDisplay显示单个组的计数,而不是组数的计数

时间:2016-01-29 22:01:39

标签: dc.js crossfilter

我的数据如下:

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

1 个答案:

答案 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; }
  );