创建结构化对象的crossfilter维度

时间:2014-11-21 23:29:03

标签: crossfilter

让我们说我已经将这些数据推入了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中是否有支持这样做?

1 个答案:

答案 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);
相关问题