替换crossfilter数据,恢复维度和组

我使用dc.js来渲染数据集的一个漂亮的气泡图。 底层的dc.js是交叉过滤器。

我想用来自服务器的新数据平滑地刷新我的图表。 Github上的这个问题清楚地表明,通过以下方式可以做到这一点:

  • 删除交叉过滤器中的所有数据
  • 添加新的数据
  • 调用dc.redrawAll()
  • 我有这个工作,但为了删除所有的数据,你首先必须清除所有的过滤器(因为crossfilter.remove只会删除匹配当前过滤器的记录)。

    我想'记住'我的数据之前是如何过滤的,所以我可以在我更换所有数据后重新构建过滤器。 我愿意深入crossfilter代码的crossfilter ,但任何指针都会有所帮助。

    此外:如果有人知道基于唯一密钥更新交叉过滤数据的方法,那将是金粉!


    感谢@ londonrob's回答所有数据现在都从索引中删除。 这是重置数据的更有效的方法。

    // 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();
    }
    

    这就是我最终一起入侵的原因。 它工作得很好,虽然我敢肯定它的效率很低,因为所有的维度都必须从头开始创建:

    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();
    }
    
    链接地址: http://www.djcxy.com/p/32727.html

    上一篇: Replace crossfilter data, restore dimensions and groups

    下一篇: dc.js time series format