Javascript 替换交叉筛选数据,恢复维度和组

Javascript 替换交叉筛选数据,恢复维度和组,javascript,dc.js,crossfilter,Javascript,Dc.js,Crossfilter,我正在使用渲染数据集的漂亮气泡图。底层的dc.js是 我想用服务器上的新数据顺利刷新图表。明确表明可以通过以下方式实现: 从交叉过滤器中删除所有数据 添加新数据 调用dc.redrawAll() 我已经做到了,但是为了删除所有数据,首先必须清除所有过滤器(因为只删除与当前过滤器匹配的记录) 我想“记住”我的数据以前是如何过滤的,这样我可以在替换所有数据后重新构建过滤器。我愿意深入了解交叉过滤代码的本质,但任何指针都会有所帮助 另外:如果有人知道一种基于唯一密钥更新交叉过滤器数据的方法,那就是go

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

我想用服务器上的新数据顺利刷新图表。明确表明可以通过以下方式实现:

  • 从交叉过滤器中删除所有数据
  • 添加新数据
  • 调用
    dc.redrawAll()
    我已经做到了,但是为了删除所有数据,首先必须清除所有过滤器(因为只删除与当前过滤器匹配的记录)

    我想“记住”我的数据以前是如何过滤的,这样我可以在替换所有数据后重新构建过滤器。我愿意深入了解
    交叉过滤
    代码的本质,但任何指针都会有所帮助


    另外:如果有人知道一种基于唯一密钥更新交叉过滤器数据的方法,那就是gold dust

    这是我最后一起破解的东西。它工作得非常好,尽管我确信它的效率非常低,因为所有维度都必须从头开始创建:

    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();
    }
    
    var\u xfilter=crossfilter({x:1,y:2},{x:3,y:4}),
    _维度=[];
    _push(xfilter.dimension(函数(d){returnd.x;});
    //取消筛选所有给定维度,删除所有数据
    //并将新数据添加到xf。
    var\u xfilter\u reset=函数(xf、维度、新数据){
    var i;
    对于(i=0;i
    多亏@londonrob的回答,所有数据现在都从索引中删除了。下面是一种更实用的数据重置方法

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

    你只是在添加数据吗?那么我会说使用crossfilter.add([数据])。如果您也需要删除数据,我没有什么可以提供的,但您可能想看看这个问题,如果它听起来方向正确,请发表评论:@EthanJewitt我不是在添加或删除数据。我是在更新现有数据,每一行都有唯一的键。
    add
    是否有根据键进行更新的功能?明白了-那么您确实需要删除旧数据并添加新数据(据我所知,无法更新现有密钥)。这种功能目前并不存在,因为您必须删除所有筛选器才能删除数据。就个人而言,我认为这是需要在交叉筛选器中解决的问题,关于如何解决这一问题有一些讨论,但我认为没有人有时间解决。我认为这可能是最佳的我们现在所拥有的功能非常有效-所有的组和缩减都必须重新计算。您可以尝试在没有数据的情况下重建过滤器,这样交叉过滤器就不会对每个
    。filter
    调用洗牌索引和缩减。或者我们可以期待@Ethan上面提到的功能。哇!这是个好消息。您可以链接到github修复/问题/PR解决了这个问题?不确定你的意思。我只是重写了你的代码来进行重置。哦。那么“感谢londonrob的回答,现在所有数据都从索引中删除了”指的是什么?我很困惑……你指出所有维度的每个过滤器都必须重置。不仅仅是索引上的过滤器self.Hey Rob,@line-o.。我试图在没有可复制示例的情况下实现这一点。我的版本似乎只将原始过滤器重新应用于创建它的图形,而不是实际应调整它的其他图形。请参阅。页面在3s后使用新数据成功刷新。如果在ref之前选择例如
    Mr a
    因此,除非手动取消选择并重新选择过滤器(
    Mr A
    ),否则刷新后相应的饼图不会过滤掉
    2013
    切片。我做错什么了吗?