替换crossfilter数据,还原维度和组

时间:2014-05-06 16:53:33

标签: javascript dc.js crossfilter

我正在使用dc.js来渲染数据集的漂亮气泡图。底层dc.js是crossfilter

我想用服务器上的新数据顺利刷新我的图表。 This issue on Github明确表示可以通过以下方式执行此操作:

  1. 删除crossfilter中的所有数据
  2. 添加新数据
  3. 致电dc.redrawAll()
  4. 我有这个工作,但为了删除所有数据,首先必须清除所有过滤器(因为crossfilter.remove只删除与当前过滤器匹配的记录)。

    我想“记住”之前我的数据是如何过滤的,所以一旦我替换了所有数据,我就可以重新构建过滤器。我愿意深入了解crossfilter代码的内容,但任何指针都会有所帮助。

    此外:如果有人知道基于唯一密钥更新crossfilter数据的方法,那就是金尘!

1 个答案:

答案 0 :(得分:3)

这就是我最终一起黑客攻击的原因。它运作得非常好,虽然我确信它的效率很低,因为所有维度都必须从头开始创建:

var _xfilter = crossfilter({x:1, y:2},{x:3, y:4}),
    _dimensions = [];

_dimensions.push(_xfilter.dimension(function(d) { return d.x; });

// Unfilters all the given dimensions, removes all data
// from xf and adds newData to xf.
var _xfilter_reset = function(xf, dimensions, newData) {
    var i;
    for (i = 0; i < dimensions.length; i++) {
        // Clear all filters from this dimension.
        // Necessary because xf.remove only removes records
        // matching the current filter.
        dimensions[i].filter(null);
    }
    xf.remove(); // Remove all data from the crossfilter
    xf.add(newData);
    return xf;
}

// Resets the global crossfilter object and reapplies all
// current dc.js chart filters.
var _refresh_data = function(data) {
    var i, j,
        chart, oldFilters,
        allCharts = dc.chartRegistry.list();

    _xfilter = _xfilter_reset(_xfilter, _dimensions, data);     

    // Reset all filters using dc.js
    for (i = 0; i < allCharts.length; i++) {
        chart = allCharts[i];
        oldFilters = chart.filters(); // Get current filters
        chart.filter(null); // Reset all filters on current chart
        for (j = 0; j < oldFilters.length; j++) {
            // Set all the oldFilters back onto the chart
            chart.filter(oldFilters[j]);
        }
    }
    dc.redrawAll();
}