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