【问题标题】:RXJS - Filter by another observable then groupByRXJS - 按另一个 observable 然后 groupBy 过滤
【发布时间】:2018-07-12 08:07:45
【问题描述】:

我有一组可观察的任务。我想通过另一个可观察的(文本输入)过滤这些任务。

然后我想通过“实体”属性对过滤后的任务进行分组并映射,因此结果是:

{ 'entity': 'a',
  'tasks': [...] },
{ 'entity': 'b',
  'tasks': [...] }

这是我做过的最接近的测试:

https://stackblitz.com/edit/rxjs-filter-group

但我似乎无法将它们正确分组..

【问题讨论】:

  • 由于您使用的是BehaviorSubject,因此当您获得分组结果时这是一个问题,因为combineLatest 在其所有源 Observables 完成之前不会完成。您可以为每个键累积任务,但随后您将多次收到同一个组。
  • 我实际上不记得我为什么使用 behaviorSubject,我想是因为我想初始化值..?我应该只使用普通的 observable 吗?
  • 如果你想将它用作searchQuery$,你需要使用一个主题。
  • 如果我改变它,你认为它应该有效吗?我的 groupBy 是否正确?
  • 这取决于您是希望它为每个组只发出一次还是每次向组中添加新任务时发出。例如,您可以这样做:stackblitz.com/edit/rxjs-filter-group-utze4b?file=app/…

标签: filter rxjs combinelatest


【解决方案1】:

我已经更新了你的部分代码,请看:

const tasks = combineLatest(source,this.searchQuery$).pipe(
        map(([tasks,query]) => {
          return tasks.filter(task => {
            return task.name.toLowerCase().indexOf(query.toLowerCase()) > -1;
          })
        }),
      mergeMap(v => from(v)
        .pipe(
            groupBy(task => task.entity),
            mergeMap(group => group.pipe(toArray()))
        )
      )
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2020-06-24
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多