[英]How do I create an flattened array of arrays that are part of an object in an array, essentially get the child arrays of multiple objects?
[英]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.