2017-08-04 78 views
3

我对可观察对象很陌生,对其他人来说这可能是一个愚蠢的问题,但我找不到一种方法来做到这一点。如何将 Observable<Array<T>>其中T是TypeScript类,并将属性Id(string)转换为Array<string>?我想将Id属性转换为字符串数组。可观察到的转换

+0

提取你能参考这个[**答案**](https://stackoverflow.com/questions/44467336/how-can-i-get-an-observer-of-an-input-value-in-child-component/44467942 #44467942) – Aravind

+0

你看过“map”操作吗要么? – Hitmands

+0

@Aravind谢谢你的建议,但我不认为这回答我的问题,尽管我从中得到了一些想法。 – user2278488

回答

1

您正试图在这里做两件事情:

  1. 拼合从源阵列中的所有阵列整合到单一可观察的T
  2. 地图的每个实例TId财产

您可以使用mergeAll来展平观测值,就像在普通JS阵列上使用reduce一样。

const source = Rx.Observable.of(
    [{ Id: '1' }, { Id: '2' }], 
    [{ Id: '3' }, { Id: '4' }] 
); 

const flattened = source.mergeAll(); 

flattened.subscribe(s => console.log(s)); 
// => {Id:'1'}, {Id:'2'}, {Id:'3'}, {Id:'4'} 

然后,您可以使用map(与正常JS数组)到Id财产

const mapped = flattened.map(s => s.Id); 

mapped.subscribe(s => console.log(s)) 
// => '1', '2', '3', '4' 

它全部拉入1个语句和...

source 
    .mergeAll() 
    .map(s => s.Id) 
    .subscribe(s => console.log(s)) 

// => '1', '2', '3', '4' 
0

您可以使用像javascript数组上的reduce操作符。 RxJS减少操作员在完成时将对整个流进行操作。

见例如:

let data$ = new Rx.Subject(); 

data$ 
    .reduce((acc, el) => {acc.push(...el); return acc;}, []) 
    .subscribe(x=>console.log(x)); 

    data$.next([{id:'1'}, {id:'2'}]); 
    data$.next([{id:'3'}, {id:'4'}]); 
    data$.complete();