2016-04-10 27 views
0

Ich habe ein Array von Threads-Objekten mit ID, Titel und einem isBookmarked: boolean.angular2 observables filter jedes Array-Element als Rückgabe an ein Array

Ich habe einen Betreff erstellt und möchte ihn abonnieren, um ein Array von Thread-Objekten mit isBookmarked = true zu erhalten.

https://plnkr.co/edit/IFGiM8KoSYW6G0kjGDdY?p=preview

Im Inneren der Dienst habe ich

export class Service { 

    threadlist:Thread[] = [ 
    new Thread(1,'Thread 1',false), 
    new Thread(2,'Thread 2',true), 
    new Thread(3,'Thread 3',false), 
    new Thread(4,'Thread 4',true), 
    new Thread(5,'Thread 5',true), 
    new Thread(6,'Thread 6',false), 
    new Thread(7,'Thread 7',false), 
    ] 

    threadlist$:Subject<Thread[]> = new Subject<Thread[]>() 

update() { 
    this.threadlist$.next(this.threadlist) 
} 

} 

in der Komponente

export class AppComponent implements OnInit { 
localThreadlist:Thread[]; 
localThreadlistFiltered:Thread[]; 
constructor(private _service:Service){} 

ngOnInit():any{ 
    //This updates the view with the full list 
    this._service.threadlist$.subscribe(threadlist => { 
    this.localThreadlist = threadlist; 
    }) 
    //here only if isBookmarked = true 
    this._service.threadlist$ 
    .from(threadlist)//???? 
    .filter(thread => thread.isBookmarked == true) 
    .toArray() 
    .subscribe(threadlist => { 
     this.localThreadlistFiltered = threadlist; 
    }) 
    } 
    update() { 
    this._service.update(); 
    } 
} 

die Instanz-Methode kann ich in der Regel verwenden, um ein Array zu spalten? Gibt es auch einen besseren Weg, es zu tun?

Dank

+0

Für die Filterung hätten Sie 'this.localThreadlistFiltered = localThreadlist.filter (i => i.isBookmarked)' gemacht. Warum verwenden Sie auch ein 'Subject'? Alles, was Sie haben, ist ein Array, das Sie herumreichen. Kann es einen Strom von Fäden geben? – Abdulrahman

+0

ja die Threadliste soll in mehreren Komponenten in einem Forum herumgereicht werden, das ich mit angular2 baue. Dieser Code dient nur der Erläuterung. Ich möchte die Filterung im Stream erfolgen, und ich weiß, dass es einen Operator geben muss, um die Arrays zu teilen –

+0

Ja, es gibt eine [splice] (https://developer.mozilla.org/en/docs/Web/ JavaScript/Referenz/Global_Objects/Array/splice) und [slice] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice). 'splice', modifiziert das Array. Während 'slice' eine Kopie des modifizierten Arrays zurückgibt. Suchst du danach ? – Abdulrahman

Antwort

1

Sie würden die filter Methode von JavaScript-Array innerhalb des map Betreiber von Observablen nutzen:

this._service.threadlist$ 
    .map((threads) => { 
    return threads.filter((thead) => thread.isBookmarked); 
    }) 
    .subscribe(threadlist => { 
    this.localThreadlistFiltered = threadlist; 
    }); 

dieses plunkr Siehe: https://plnkr.co/edit/COaal3rLHnLJX4QmvkqC?p=preview.