我有一系列对象,如下所示:
private questions: Question[] = [
{
title: "...",
category: "Technologie",
answer: `...`
},
{
title: "...",
category: "Technologie",
answer: `...`
},
{
title: "...",
category: "eID",
answer: `...`
}
];
我想按类别对它们进行分组,根据值过滤它们并将结果作为数组返回。目前,我正在使用它:
Observable
.from(this.questions)
.groupBy(q => q.category)
.map(go =>
{
let category: Category = { title: go.key, questions: [] };
go.subscribe(d => category.questions.push(d));
return category;
})
.filter(c => c.title.toLowerCase().indexOf(value.toLowerCase()) >= 0 || c.questions.filter(q => q.title.toLowerCase().indexOf(value.toLowerCase()) >= 0).length > 0)
.toArray()
这会在类别标题中找到值,但不会在问题标题中找到值。我认为这是因为我在subscribe
中使用了map
,因此,问题在filter
方法中尚未提供,所以我想知道是否有&{} #39;有可能在进入subscribe
之前等待filter
结束。我的研究向我指出flatMap
,但我无法做到我想做的事。
修改
我发现我可以解决这个问题:
Observable
.from(this.questions)
.filter(q => q.category.toLowerCase().indexOf(value.toLowerCase()) >= 0 || q.title.toLowerCase().indexOf(value.toLowerCase()) >= 0)
.groupBy(q => q.category)
.map(go =>
{
let category: Category = { title: go.key, questions: [] };
go.subscribe(d => category.questions.push(d));
return category;
})
.toArray()
但我仍然对答案感兴趣。
答案 0 :(得分:1)
当你使用groupBy时,你得到一个可以用concatMap,mergeMap,switchMap等运算符展平的分组observable。在这些运算符中,可以为每个类别单独转换分组的observable,即将问题一起收集到一个数组中缩小,然后使用map创建所需的对象。
Observable
.from(questions)
.groupBy(q => q.category)
.mergeMap(go => {
return go.reduce((acc, question) => { acc.push(question); return acc; }, [])
.map(questions => ({ title: go.key, questions }));
})
.filter(c => "...")
.toArray()