如何使过滤器应用于多个交叉过滤器实例中的维度?

时间:2015-03-27 00:21:02

标签: javascript dc.js crossfilter

我使用一些非常简化的数据来说明这个想法。假设我的数据集是:

var data = 
[{type:"cat",row:1, col:1, speed:15},
{type:"cat",row:1, col:2, speed:10},
{type:"cat",row:2, col:1, speed:3},
{type:"cat",row:2, col:2, speed:17},
{type:"dog",row:1, col:1, speed:25},
{type:"dog",row:1, col:2, speed:30},
{type:"dog",row:2, col:1, speed:16},
{type:"dog",row:2, col:2, speed:10}]

我对这些数据有几个维度,例如

var ndx = crossfilter(data);
var mainDim = ndx.dimension(function (d) {
    return [+d.row, +d.col];
});
var mainGroup = mainDim.group().reduceSum(function (d) {
    return +d.speed;
});
var rowDim = ndx.dimension(function (d) {
    return d.row;
});
var rowGroup = rowDim.group();

使用此数据集构建了几个DC.JS图表。

现在的问题是,我想要一种动态生成图表的方法,例如为每个type生成一个heatMap。我只能通过一个交叉滤波器实例找到一种方法来实现这一点,因此我使用自己的交叉实例,维度,组等创建了过滤数据集。

// Get list of unique types
var types = [];
data.forEach( function(d) { 
    if( types.indexOf(d.type ) == -1 )
        types.push(d.type); 
});


// Create new dataset for each type
var filteredData = {};
function checkType(elem, type){
    return elem.type == type;
}
types.forEach(function(type){
    filteredData[type] = data.filter(function(elem){ 
        return checkType(elem,type);
    });
});

var crossfilters = {};
var dims = {};
var grps = {};
types.forEach(function(type){
    // Create crossfilter for each type
    crossfilters[type] = crossfilter(filteredData[type]);

    // Create dimensions & for each type
    dims[type] = crossfilters[type].dimension(function (d) {
        return [+d.row, +d.col];
    });

    grps[type] = dims[type].group().reduceSum(function (d) {
        return +d.speed;
    });
});

我仍然希望用户与图表的交互能够在不同的crossfilter实例之间传播过滤器。有没有办法动态实现这个目标?

jsfiddle with working demonstration

0 个答案:

没有答案