簡體   English   中英

如何從陣列數組創建“扁平”組?

[英]How can I create a “flattened” group from an array of arrays?

我有一個由用戶發布的帖子列表構建的crossfilter ,我想使用這些數據來驅動單詞雲樣式的可視化。

我的記錄是這樣的對象數組:

[
    {
      "date": Thu May 24 2018 11:29:27 GMT+0100 (GMT Daylight Time),
      "text": "Lorem ipsum dolor sit amet"
    },
    ...etc
]

我在日期字段上設置了一些維度來過濾我的記錄,我希望更新單詞雲的內容以反映過濾后的數據。 我不確定如何設置一個組,該組是過濾后的帖子中每個單詞的平面數組。

設置這樣的維度

var textDimension = ndx.dimension(p => p.split(' '))

會給

[
    ['Lorem', 'ipsum', 'dolor',  'sit', 'amet'],
    ...etc
]

這很好,但似乎沒有辦法做textDimension.group(/* do something...*/).reduceSum(r => 1)將維度視為

[
    'Lorem',
    'ipsum',
    'dolor',
    'sit',
    'amet'
]

reduceSum會產生類似的東西

[
    {"key": "Lorem", "value": 1},
    {"key": "ipsum", "value": 1},
    {"key": "dolor", "value": 1},
    {"key": "sit", "value": 1},
    {"key": "amet", "value": 1},
]

代替

[
    {"key": ['Lorem', 'ipsum', 'dolor',  'sit', 'amet'], "value": 1},
]

這就是它目前如何處理group()邏輯。 我可以做我想做的事

var filteredPosts = ndx.allFiltered()
var wordsByPost = filteredPosts.map(p => p.split(' ')
var allWords = [].concat.apply([], wordsByPost)

然后計算allWords中每個單詞的實例(可能通過設置一個新的crossfilter),但感覺這是錯誤的方法。

有沒有辦法使用我已經設置的crossfilter來做到這一點,還是我承認失敗並使用基本的JS解決方案?

一旦你擁有數組中的所有單詞,就可以展平你的數組,然后使用array#reduce你可以根據對象累加器中的唯一單詞對數組進行分組。 然后使用Object.values()從對象獲取所有值。

 const data = [ { "date": 'Thu May 24 2018 11:29:27 GMT+0100 (GMT Daylight Time)', "text": "Lorem ipsum dolor sit amet" }, { "date": 'Thu May 24 2018 11:29:27 GMT+0100 (GMT Daylight Time)', "text": "Lorem ipsum2 dolor2 sit amet" } ], result = Object.values([].concat(...data.map(({text}) => text.split(' '))) .reduce((r,w) => { r[w] = r[w] || {key: w, value : 0}; r[w].value += 1; return r; },{})); console.log(result); 

如果您使用的是Crossfilter 1.4+,那么您只需要告訴它維度是一個數組維度,如下所示:

var textDimension = ndx.dimension(p => p.split(' '), true)

文檔: https//github.com/crossfilter/crossfilter/wiki/API-Reference#dimension_with_arrays

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM