javascript - 如何从数组数组创建 "flattened"组?

标签 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
]

我在日期字段上设置了一些维度来过滤我的记录,我希望更新词云的内容以反射(reflect)过滤后的数据。我不确定如何设置一个由过滤后的帖子中的每个单词组成的平面数组。

像这样设置维度

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() 中处理 do 逻辑的方式。我可以用

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

然后计算 allWords 中每个单词的实例(可能通过设置一个新的交叉过滤器),但感觉这样做的方法是错误的。

有没有办法使用我已经设置好的交叉过滤器来做到这一点,或者我承认失败并使用基本的 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);

关于javascript - 如何从数组数组创建 "flattened"组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50621780/

相关文章:

javascript - 如何从两个不同长度的数组javascript创建对象数组

javascript - CSS 文本右对齐不起作用。如何解决?

python - 维度不可知(通用)笛卡尔积

javascript - 在 JavaScript 中混合命名和未命名参数?

javascript - 在 Angular 上,如何通过模板内的括号表示法访问对象属性?

c++ - 使用 sizeof() 计算数组大小

javascript - 来自 JSON 数组的 JQuery 中的 forEach 不是函数错误

javascript - 最简单的方法 - 仅在 ajax 请求函数完成时调用函数 - 回调、promise

javascript - 根据对象中键的值对数组中的对象进行分组

javascript - jQuery Tipsy 不能与 jQuery.each() 一起使用,并且不能使用 :true