首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换交叉筛选数据,还原维度和组

替换交叉筛选数据,还原维度和组
EN

Stack Overflow用户
提问于 2014-05-06 16:53:32
回答 2查看 5.6K关注 0票数 7

我正在使用dc.js来呈现一个很好的数据集气泡图。底层dc.js是crossfilter

我想用来自服务器的新数据平稳地刷新我的图表。This issue on Github明确表示,可以通过以下方法来做到这一点:

  1. 删除交叉筛选器中的所有数据
  2. 添加新数据
  3. 打给dc.redrawAll()

我已经做到了这一点,但是为了删除所有数据,首先必须清除所有过滤器(因为crossfilter.remove只删除与当前筛选器匹配的记录)。

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

另外:如果有人知道一种基于唯一键更新交叉过滤器数据的方法,那就是金尘!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-25 10:17:21

由于@londonrob的回答,所有数据现在都从索引中删除了。以下是一种更实用的数据重置方法。

代码语言:javascript
复制
// reset the filter for a dimension
function resetDimensionFilter (dimension) {
  dimension.filter(null);
}

// reset filters for all given dimensions, 
// remove all data from index and
// return empty index
function resetData(ndx, dimensions) {
  // Clear all filters from dimensions, because `ndx.remove` 
  // only removes records matching the current filters.
  dimensions.forEach(resetDimensionFilter);

  // Remove all data from the cross filter
  ndx.remove();
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-07 14:07:04

这就是我最后在一起黑客的下场。它运行得非常好,尽管我确信它效率低下,因为所有维度都必须从头开始创建:

代码语言:javascript
复制
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();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23500546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档