我有一个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/