在地图中使用GroupedObservable上的订阅

时间:2017-03-08 12:02:32

标签: rxjs

我有一系列对象,如下所示:

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()

但我仍然对答案感兴趣。

1 个答案:

答案 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()