如何动态构建一个crossfilter组数组?

时间:2014-01-22 11:27:30

标签: javascript crossfilter dc.js

我有一个包含部分未知列的交叉过滤数据结构。

我想绘制一个复合dc.js图表​​,能够动态打开和关闭y维度。

因此,我尝试为每列构建一个组数组:

this.data = crossfilter(this.rawData);

this.idDimension = this.data.dimension(function (d) {
    return d.id;
});

for (var property in this.rawData[0]) {
    this.groups[property] = this.idDimension.group().reduceSum(function (d) {
        return d[property];
    });
}

问题是每个组都在循环中最后一个属性的列上工作。

我该怎样绕过这个?或者有更好的方法来实现我想要的目标吗?

2 个答案:

答案 0 :(得分:1)

问题在于变量范围。

我找到的解决方案就是这样:

var createPropertyGroup = function(dimension, property) {
    return dimension.group().reduceSum(function (d) {
            return d[property];
        });
}

for (var property in this.rawData[0]) {
    this.groups[property] = createPropertyGroup(this.idDimension, property);
}

答案 1 :(得分:0)

我不确定这对您的情况是否有帮助,但您也可以将多个属性添加到同一组中。

    teamMemberGroup = teamMemberDimension.group().reduce(

    function (p, d) {
        p.count++;
        p.name = d.name;
        p.salary = d.salary;
        p.start_date = d.start_date;
        return p;
    },

    function (p, d) {
        p.count--;
        return p;
    },

    function () {
        return {count: 0, name: "", salary: 0, p.start_date = null};
    });

DCCharts的valueAccessor方法可用于区分不同图表的不同y值。

teamMemberChart
        .dimension(teamMemberDimension)
        .group(teamMemberGroup)
        .valueAccessor(function (d) {
        return d.value.count;
    })

根据您的情况,这可能有助于简化您的代码,而可能会提高性能。