![](/img/trans.png)
[英]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.