让我们说我已经将这些数据推入了crossfilter:
[
{user: 'abby', town: 'reading', postcode: 'RG'},
{user: 'ben', town: 'reading', postcode: 'RG'},
{user: 'charlie', town: 'bristol', postcode:'BS'}
]
请注意数据的扁平化特性 - 邮政编码字段将始终是城镇字段的映射,因此每当town =阅读时,邮政编码将= RG等。
我希望能够建立一个城镇。来自城镇和邮政编码字段的维度,因此当我过滤我的用户维度时,请使用' abby',当我调用group().all()
时,城镇维度将返回像这样的数组:
[
{town: 'reading', postcode: 'RG' }
]
这样做的正确方法是什么?
我知道我可以通过类似
的方式制作城镇维度var townDimension = myCrossFilter.dimension(function(row) {
return row.town + ':' + row.postcode;
})
然后,在过滤维度上调用group()。all()后,我必须手动将结果字符串列表转换为{town,postcode}对象列表。
但是在crossfilter中是否有支持这样做?
答案 0 :(得分:0)
根据Ethan的评论,以下代码用于创建维度:
var dim = myCrossFilter.dimension(function(row) { return new KeyValue(row.town, row.postcode);});
为了使其正常工作和过滤,我覆盖了KeyValue对象中的valueOf方法。
我应该提到我实际上是在Typescript中编写它,而不是Javascript,所以KeyValue类的TypeScript代码是:
class KeyValue {
constructor(key: any, value: any) {
this.key = key;
this.value = value;
}
key: any;
value: any;
valueOf(): any {
return this.key == null ? null : this.key.valueOf();
}
}
我不确定这是否会对性能造成太大影响 - 我不是基于函数进行过滤,我仍然可以使用以下代码进行过滤:
var options : KeyValue[] = dim.group().all();
var selectedOption : KeyValue = options[3]; //let's say I selected the 4th option
dim.filter(selectedOption);