【问题标题】:RxJS groupBy on ngrx effects to observable custom arrayRxJS groupBy 对可观察自定义数组的 ngrx 效果
【发布时间】:2019-12-18 22:57:47
【问题描述】:

我正在使用 ngrx 效果从 API 获取数据。我尝试了不同的 rxjs 运算符组合来实现这一点。目前使用 groupBy 运算符来实现以下目标

API 数据:

projects = [{id: 1, name: project1, department: dept1, instance_count: 3},
{id: 2, name: project2, department: dept2, instance_count: 6},
{id: 3, name: project3, department: dept1, instance_count: 1},
{id: 1, name: project1, department: dept1, instance_count: 8}]

我可以选择根据部门进行过滤。所以选择'dept1'时的输出应该是

结果:

filteredProjects = [{id: 1, name: project1, department: dept1,   instance_count: 11 }, {id: 3, name: project3, department: dept1, instance_count: 1}] 

我尝试使用 groupBy 根据 'id' 或 'department' 对数据进行分组,然后应用过滤器并添加分组数据的计数。

this.projects$: Observable<Project[]> = this._store.select(state => state.projects.allProjects)
  .map((projects: Project[]) => projects);

this.projects$.pipe(
groupBy(
project => project.id)
   ).subscribe(console.log);

我无法让 groupBy 和 mergeMap 正常工作。我看到的大多数示例都没有使用管道运算符。这是抛出错误“Project []”类型上不存在“属性”ID。

【问题讨论】:

标签: angular rxjs ngrx rxjs6 ngrx-effects


【解决方案1】:

如果我正确理解了你想要的输出,你可以应用这个 sn-p 的一部分来得到你想要的:

test = [{id: 1, name: 'project1', department: 'dept1', instance_count: 3},
{id: 2, name: 'project2', department: 'dept2', instance_count: 6},
{id: 3, name: 'project3', department: 'dept1', instance_count: 1},
{id: 1, name: 'project1', department: 'dept1', instance_count: 8}];

constructor() {
    from(this.test).pipe(filter(a => a['department'] == 'dept1'), toArray()).subscribe(console.log);
}

控制台记录将是一个数组,其中仅包含部门 == 'dept1' 的条目

EDIT1:(回答问题:过滤后需要根据‘id’申请groupBy)

使用这个 sn-p 会给你两个分组结果数组:

from(this.test).pipe(filter(a => a['department'] == 'dept1'), groupBy(a => a.id), mergeMap(a => a.pipe(toArray()))).subscribe(console.log);

【讨论】:

  • 正要编写这个确切的代码 ^^ 我个人总是更喜欢pipe 中的每个运算符一行,但格式是我唯一要更改的内容。
  • 过滤后需要根据‘id’申请groupBy。
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多