关于crossfilter:dc.js boxplot b.map(…)。sort不是一个函数

dc.js boxplot b.map(…).sort is not a function

我正在尝试生成箱形图。创建维度和组后,我按照在
https://github.com/dc-js/dc.js/blob/master/web/examples/box-plot.html

我正在使用还原法来简化还原操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var ndx = crossfilter(ds);
var skuDim = ndx.dimension(function(d){ return d.sku; });
var skuGroup = skuDim.group();

var reducer = reductio();
reducer
  .value('_nc')
  .sum(function(d){
      return d.nc;
  });
reducer
  .value('_ta')
  .sum(function(d){
      return d.ta;
  });

reducer(skuGroup);

我也正在为我的组使用valueAccessor:

1
2
3
  .valueAccessor(function(p){
    return p.value._nc.sum ? Math.round(p.value._ta.sum / p.value._nc.sum * 100) / 100 : 0;
  })

我遇到此错误:

1
TypeError: b.map(...).sort is not a function.

我添加了一个小提琴来复制此问题。 https://jsfiddle.net/momhzyxp/7/

干杯


您可以使用reductio.dataList生成落入每个bin中的原始行的数组,而不是使用reductio将值聚合为总和:

1
2
3
4
5
6
var reducer = reductio();
reducer
  .value('_rows')
  .dataList(true);

reducer(skuGroup);

然后,假设您想将每个ta除以每个nc(不确定您要在这里做什么),则valueAccessor看起来像:

1
2
3
4
5
6
  .valueAccessor(function(p){
    var values = p.value._rows.dataList.map(function(v, i) {
      return v.nc ? Math.round(v.ta / v.nc * 100) / 100 : 0;
    });
    return values;
  })

(或者您可以对每个v.tav.nc做任何您想做的事情)。

小提琴的叉子:https://jsfiddle.net/oawbzdgy/11/