首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroupBy‘rxjs/操作符’以角6中的键值和值数组排列

GroupBy‘rxjs/操作符’以角6中的键值和值数组排列
EN

Stack Overflow用户
提问于 2018-07-30 08:44:02
回答 2查看 3.1K关注 0票数 1

我有一个问题,我从web得到一个数组作为响应。

反应的结构很简单:

代码语言:javascript
复制
interface CabinInfo {
    id: number;

    projectId: number;
    cabinId: number;
    ipAddress: string;
    port: number;
}

因此,现在我需要按照projectId对其进行分组,因此自然地,我会使用rxjs/操作符来获得某种类型的d数组,我可以在html中迭代,所以我使用:

代码语言:javascript
复制
        this.clientService.GetAllApplications()
            .subscribe(result => {
                const projectsObservable: Observable<CabinInfo> = from(result);
                const projectsList = projectsObservable.pipe(groupBy(cabin => cabin.projectId, cabin => cabin)
                    , mergeMap(group => group.pipe(map(() => ({ projectId: group.key, cabins: group.pipe(toArray())})))));

            }, error => { console.error(error); });

但是它不能像我想的那样起作用,我希望

代码语言:javascript
复制
Array<number|CabinInfo[]> 

我只得到了一些复杂的东西,比如

代码语言:javascript
复制
Observable<{projectId: number, Observable<CabinInfo>[]}> 

有没有办法把它转换成简单的数组??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-30 08:46:36

so naturally i would use rxjs/operators

你生活在一个奇怪的本性里我的朋友..。

使用Array.prototype.reduce函数:

代码语言:javascript
复制
.subscribe(result => {
  this.groupedResults = result.reduce((p, n) => {
    if (!p[n.projectId]) { p[n.projectId] = []; }
    p[n.projectId].push(n);
    return p;
  }, {});
});
票数 2
EN

Stack Overflow用户

发布于 2018-07-30 09:06:08

由于您使用的是角,所以您可以在html中使用异步管道,所以您不需要订阅可观察到的内容,但是可以让角处理逻辑。相反,你可以进入你的可观察的操作符。

代码语言:javascript
复制
this.$applications = this.clientService.GetAllApplications()
        .pipe(
            groupBy(cabin => cabin.id),
            mergeMap(group => group.pipe(toArray()))
        );

在您的html中,您将得到如下内容:

代码语言:javascript
复制
<div *ngFor="let c of $applications | async">

</div>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51590090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档