繁体   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