首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJS 6获取经过筛选的可观察数组列表

RxJS 6获取经过筛选的可观察数组列表
EN

Stack Overflow用户
提问于 2018-06-03 01:19:13
回答 5查看 13.8K关注 0票数 6

在我的ThreadService类中,我有一个函数getThreads(),它返回一个包含所有线程的Observable<Thread[]>

现在,我想要我的函数的另一个版本,通过一个选定的主题过滤我的线程: function getSelectedThemeThreads(theme: Theme)

我尝试使用操作符mapfilter,但得到以下错误消息Property 'theme' does not exist on type 'Thread[]

下面是我正在编写的代码:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Thread } from '../models/thread.model';
import { Theme } from '../models/theme.model';

@Injectable({
  providedIn: 'root'
})
export class ThreadService {
  private threadsUrl = 'api/threads';

constructor(private http: HttpClient) { }

getThreads(): Observable<Thread[]> {
  return this.http.get<Thread[]>(this.threadsUrl);
}

getSelectedThemeThreads(): Observable<Thread[]> {
  return this.http.get<Thread[]>(this.threadsUrl).pipe(
    map(threads => threads),
    filter(thread => thread.theme.id === theme.id)
  );
}

提前感谢您的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-03 06:55:48

我做了一个这个StackBlitz / angular6-filter-result的例子

主要思想是在map()中进行过滤,因为过滤器将获得一个对象数组。

代码语言:javascript
复制
getSelectedThemeThreads(theme: string): Observable<Flower[]> {
    return this.http.get<Flower[]>(this.threadsUrl).pipe(
      map(result =>
        result.filter(one => one.theme === theme)
      )
    )
  }
票数 9
EN

Stack Overflow用户

发布于 2018-06-03 15:26:13

你就快到了。使用此map(threads => threads)不会做任何事情,但您可能希望使用下面的代码:

代码语言:javascript
复制
mergeMap(threads => threads) // will turn Observable<Thread[]> into Observable<Thread>

concatMapswitchMap也可以工作。mergeMap操作符将迭代数组并分别发出每个项,这样您就可以像以前那样使用filter()了。

当然,您还可以使用以下命令:

代码语言:javascript
复制
map(threads => threads.find(thread => thread.theme.id === theme.id)),
filter(thread => thread !== undefined),
票数 2
EN

Stack Overflow用户

发布于 2018-06-03 06:05:47

尝试使用以下代码。

代码语言:javascript
复制
getSelectedThemeThreads(theme): Observable<Thread[]> {
    return this.http.get<Thread[]>(this.threadsUrl)
    .map(res => res)
    .filter(thread => thread.theme.id == theme.id);
}    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50659367

复制
相关文章

相似问题

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