2014-11-21 61 views
0

比方說我有這個數據推入crossfilter:創建結構化對象的crossfilter尺寸

[ 
    {user: 'abby', town: 'reading', postcode: 'RG'}, 
    {user: 'ben', town: 'reading', postcode: 'RG'}, 
    {user: 'charlie', town: 'bristol', postcode:'BS'} 
] 

注意數據的扁平性質 - 郵政編碼場總是會從鎮場的映射,所以每當鎮=閱讀,郵政編碼將= RG等

我想能夠創建一個城鎮維度來源於鎮和郵政編碼字段,以便當我過濾我的用戶維度,用'abby'表示,那麼當我呼叫group().all()時,城鎮維度將返回如下數組:

[ 
    {town: 'reading', postcode: 'RG' } 
] 

這樣做的正確方法是什麼?

我知道我可以產生一個小鎮尺寸的東西,如

var townDimension = myCrossFilter.dimension(function(row) { 
    return row.town + ':' + row.postcode; 
}) 

,然後調用組(後)。所有()上過濾的維,我將不得不手動轉換造成的列表串入{城鎮,郵編}對象列表。

但是在crossfilter中是否有支持這樣做?

+0

這不是真的值得Crossfilter這樣做,我也不會想到。我只是在鏈接城鎮和郵政編碼的一側保留一張地圖,然後在顯示數據時添加郵政編碼。如果您必須這樣做,您可能需要調查將維度定義爲[「town」,「postcode」]的2元素數組是否適合您。 – 2014-11-24 14:44:07

+0

是的,我的這個問題的目的確實是調查是否可以將維度定義爲城鎮和郵政編碼的2元素數組。 – 2014-11-24 14:48:10

+0

你試過了嗎?我相信它應該起作用。雖然我認爲你必須使用函數來過濾。 – 2014-11-24 14:49:05

回答

0

按Ethan的評論,下面的代碼工作,以創建維度:

var dim = myCrossFilter.dimension(function(row) { return new KeyValue(row.town, row.postcode);}); 

爲了它的工作和正確篩選,我推翻在我的鍵值對象的valueOf方法一樣。

我應該提到的是,我居然在打字稿,不使用Javascript,寫這使我對鍵值類打字稿代碼:

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);