使用下拉列表过滤crossfilter维度

时间:2014-05-15 10:56:00

标签: dc.js crossfilter

我试图通过在下拉列表中选择值来过滤我的行图。 我这样做是通过创建维度并根据下拉列表中的选定值将过滤器应用于该维度。

行图必须显示平均值,为此我创建了ReduceAdd / Remove / Initial函数。 平均值按预期工作。

但是,当我过滤用于下拉列表的维度时,它似乎会在我的行图表中添加重复值。

示例代码:http://jsfiddle.net/sy9xA/4/

var dropDownFilterDimension;
function ReduceAdd(p, v) {
var value = v.value;
++p.countAvg;
p.totalAvg += value;            
return p;
 }

 function ReduceRemove(p, v) {
var value = v.value
--p.countAvg;
p.totalAvg -= value;            
return p;
}

function ReduceInitial() {
return {countAvg: 0, totalAvg: 0};
}


function filterDropdown(dropDownID){
dropDown = document.getElementById(dropDownID);
dropDownFilterDimension.filterAll();
values = $(dropDown).val();
if( values != null ){
    dropDownFilterDimension.filter(function(d) { if (values.indexOf(d) > -1)   {return d;} });
}
dc.redrawAll();
 }

这里例如,当" banana"被选中进行过滤。为所有未选择的值调用ReduceRemove,但另外为banana调用ReduceAdd(即使它已经在其中)。 所以现在选择香蕉后,选择了苹果。香蕉仍然有一定的价值。

有人可以解释为什么会这样吗?或者我如何避免这种情况发生?

提前致谢! 罗伯特

1 个答案:

答案 0 :(得分:1)

我还没有完全理解你在做什么,因为jsfddle并不仅仅显示js。

我可以告诉我该怎么做:

  • 您有与dc图表关联的维度(ex chartDim)
  • 你有一个小组计算与直流图相关的平均值(ex averageGroup)
  • 你有一组带有一组值的下拉列表用作过滤器(#myDropDown)

    d3.select('#myDropDown')   .on(' change',function(){      chartDim.filter(THIS.VALUE)      dc.redrawAll();   })

dc.redrawAll()的调用不仅会更新图表,还会更新averageGroup,一切都会正常。如果dropDown具有自己的维度,则只过滤此一个而不是chartDim