我如何创建一个" flattened"一组数组的组?

时间:2018-05-31 10:09:05

标签: javascript arrays ecmascript-6 crossfilter

我根据用户发布的帖子列表构建了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
]

这很好,但似乎没有办法将维度视为<{p}}

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}, ] 中使用do逻辑的方式。

我可以做我想做的事
group()

然后计算var filteredPosts = ndx.allFiltered() var wordsByPost = filteredPosts.map(p => p.split(' ') var allWords = [].concat.apply([], wordsByPost) 中每个单词的实例(可能通过设置一个新的交叉过滤器),但感觉这是错误的方法。

有没有办法使用我已经设置的交叉过滤器来做到这一点,还是我承认失败并使用基本的JS解决方案?

2 个答案:

答案 0 :(得分:2)

一旦你拥有数组中的所有单词,就可以展平你的数组,然后使用array#reduce你可以根据对象累加器中的唯一单词对数组进行分组。然后使用Object.values()从对象获取所有值。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果您使用的是Crossfilter 1.4+,那么您只需要告诉它维度是一个数组维度,如下所示:

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

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