我正在使用RxJS根据类型键对AJAX API调用(Google Knowledge Graph)的结果进行分组。每个结果项可能包含多种类型。结果如下所示:
const data = [
{ name: 'item1', types:['A', 'B']},
{ name: 'item2', types:['C', 'D']},
{ name: 'item3', types:['A', 'B', 'C']},
{ name: 'item4', types:['B']},
{ name: 'item5', types:['B', 'C']},
{ name: 'item6', types:['A', 'D']},
{ name: 'item7', types:['B', 'C']},
];
我实现此目的的方法是展平结果,以便每个元素只包含一个类型键,以便能够使用内置运算符groupBy
。
Rx.Observable.from(data)
.flatMap(item => {
return item.types
.map(type => Object.assign({}, item, {type}) );
})
.groupBy(item => item.type)
.subscribe(type => {
type.count().subscribe(count => console.log(`${count} items has type ${type.key}`));
});
结果将转变为:
{ name: 'item1', type:'A'},
{ name: 'item1', type:'B'},
{ name: 'item2', type:'c'},
...
输出将是:
3 items has type A
5 items has type B
4 items has type C
2 items has type D
这实现了所需的行为,但我不确定复制项目是否是在完成之前与大数据的实时流一起使用的最有效方法。我还假设这是一个常见的用例,所以我想知道是否有另一个内置运算符来实现这一点,我错过了API文档。我很乐意得到一些意见或建议。