可观察的转变

时间:2017-08-04 13:17:10

标签: javascript typescript rxjs observable

我对可观察者来说很新,这对其他人来说可能是一个愚蠢的问题,但我无法找到办法。我该如何转换? Observable<Array<T>>其中T是一个TypeScript类,其属性Id(string)Array<string>?我想将Id属性转换为字符串数组。

2 个答案:

答案 0 :(得分:1)

你正在尝试做两件事:

  1. 将源数组中的所有数组展平为单个T
  2. 的可观察对象
  3. T的每个实例映射到Id属性
  4. 您可以使用mergeAll展平observable,就像在普通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'
    

答案 1 :(得分:0)

你可以在javascript数组上使用类似的reduce运算符。 RxJS reduce操作符将在完成后对整个流进行操作。

参见示例:

 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();