减少RxJS映射表达式中的运算符数

Roy*_*mir 2 javascript rxjs rxjs5 angular

我创建了一个Http请求来获取json数据.在json里面 - 有一个有阵列的物体.(我需要那个数组).

fromDb$ = of({
    Result: {
      Countries: [{      <--wanted array
        ISOCode: 1,
        Name: 'aaa'

      }, {
        ISOCode: 2,
        Name: 'bbb'

      }]
    }
  });
Run Code Online (Sandbox Code Playgroud)

但是 - 数组中的数据具有与实际需要不同的结构.

我需要将(name&ISOcode)映射到(namevalue )

这就是我尝试过的:

  • 使用pluck提取内部阵列
  • mergeMap数组对象到对象流(使用of())
  • 使用map到每个项目变换到所希望的结构
  • 使用toArray于所有换到一个阵列(这样我就可以将其绑定到控制)

这是实际的代码:

this.data = this.fromDb$.pipe(pluck<PtCountries, Array<Country>>('Result', 'Countries'), 
                                mergeMap(a => from(a)),
                                map((c: Country) => ({
                                  name: c.Name,
                                  value: c.ISOCode,
                                })),
                              toArray());
Run Code Online (Sandbox Code Playgroud)

代码确实有效,这是在线演示

看起来我的复杂程度远远超过它,是否有更好的方法呢?

Tom*_*ula 5

这一行:mergeMap(a => from(a))没有多大意义.这几乎就像你做的那样[1,2,3].map(v => v).你可以删除它.

为了简化这一点,您基本上需要在Observable.map中使用Array.map.

试试这个:

this.data = this.fromDb$.pipe(pluck<PtCountries, Array<Country>>('Result', 'Countries'),
  map((countries: Country[]) => countries.map(country => ({
    name: country.Name,
    value: country.ISOCode,
}))));
Run Code Online (Sandbox Code Playgroud)

现场演示