تایپاسکریپت - فیلتر آرایه Observable در انگولار


من یک آرایه Observable دارم و میخواهم پروژه را بر اساس نام فیلتر یا پیدا کنم. وقتی تلاش میکنم از گزینه فیلتر استفاده کنم، میگوید

ProjectService.ts

import { Injectable } from '@angular/core';
import { Project } from "../classes/project";
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

import { Http } from '@angular/http';


@Injectable()
export class ProjectService {

  private projects: Observable<Project[]>;

  constructor(private http: Http) {
    this.loadFromServer();
  }

  getProjects(): Observable<Project[]> {
    return this.projects;
  }

  private loadFromServer() {
    this.projects = this.http.get('/api/projects').map(res => res.json());
  }

  getProjectByName(name: String) {
    return this.projects.filter(proj => proj.name === name);
  }


}

کلاس پروژه

export class Project {
    public name: String;
    public miniDesc: String;
    public description: String;
    public category: String[];
    public images: any[];
}

پاسخ شماره ۱

باید باشد:

getProjectByName(name: String) {
  return this.projects
    .map(projects => projects.filter(proj => proj.name === name));
}

شما دربارهٔ عملگر فیلتر اشتباه متوجه شدید. عملگری که برای فیلتر کردن دادههای برگشتی از جریان استفاده میشود. جریان شما یک آرایه از شیء برمیگرداند، بنابراین شما نیاز به فیلتر کردن آرایه دارید تا مقدار مورد نیاز خود را به دست آورید.

راهحل بالا یک آرایه بعد از فیلتر شدن باز میگرداند، اگر میخواهید تنها یک مقدار دریافت کنید، از راهحل زیر استفاده کنید

getProjectByName(name: String) {
  return this.projects
    .map(projects => {
      let fl = projects.filter(proj => proj.name === name);
      return (fl.length > 0) ? fl[0] : null;
    });
}