我认为在 crossfilter 或 dc.js 中没有任何自动方法可以做到这一点。但是,如果您愿意推出自己的维度包装器,则可以提供它而不是原始维度对象,并将其转发给所有底层维度。
编辑:基于下面@Aravind 的小提琴,这是一个有效的“维度镜像”,至少对于这个简单的例子:
function mirror_dimension() {
var dims = Array.prototype.slice.call(arguments, 0);
function mirror(fname) {
return function(v) {
dims.forEach(function(dim) {
dim[fname](v);
});
};
}
return {
filter: mirror('filter'),
filterExact: mirror('filterExact'),
filterRange: mirror('filterRange'),
filterFunction: mirror('filterFunction')
};
}
使用它有点乱。对于要从交叉过滤器 A 镜像到交叉过滤器 B 的每个维度,您需要在交叉过滤器 B 上创建一个镜像维度,反之亦然:
// Creating the dimensions
subject_DA = CFA.dimension(function(d){ return d.Subject; });
name_DA = CFA.dimension(function(d){ return d.Name; });
// mirror dimensions to receive events from crossfilter B
mirror_subject_DA = CFA.dimension(function(d){ return d.Subject; });
mirror_name_DA = CFA.dimension(function(d){ return d.Name; });
subject_DB = CFB.dimension(function(d){ return d.Subject; });
name_DB = CFB.dimension(function(d){ return d.Name; });
// mirror dimensions to receive events from crossfilter A
mirror_subject_DB = CFB.dimension(function(d){ return d.Subject; });
mirror_name_DB = CFB.dimension(function(d){ return d.Name; });
现在您在将它们传递到图表时将它们联系在一起:
// subject Chart
subjectAChart
.dimension(mirror_dimension(subject_DA, mirror_subject_DB))
// ...
// subject Chart
subjectBChart
.dimension(mirror_dimension(subject_DB, mirror_subject_DA))
// ...
nameAChart
.dimension(mirror_dimension(name_DA, mirror_name_DB))
// ...
nameBChart
.dimension(mirror_dimension(name_DB, mirror_name_DA))
// ...
由于所有图表都是implicitly on the same chart group,因此重绘事件在过滤时将自动在它们之间传播。并且一个交叉过滤器上的每个过滤器操作都将应用于另一个交叉过滤器上的镜像维度。
也许不是我推荐做的事情,但像往常一样,它可以工作。
这是小提琴:https://jsfiddle.net/gordonwoodhull/7dwn4y87/8/