RxJs如何在Observable <array>中映射项目

时间:2018-11-03 05:57:36

标签: angular rxjs

我创建了一些简化的代码来说明我的问题。

我的observable发出一个数组。我试图映射数组中的项,但是我不得不在RxJS映射运算符中使用Array.map来实现此目的。我正在寻找一种更多的RxJs方法来实现不使用Array.map的相同操作。这是stackblitz,这是基本代码。谢谢。

this.myObservable$ = of(json).pipe(
  map((data: any[]) => {
    return data.map((navigation: any) => {
      return <INavigation> {
        Id: navigation.Id,
        AppId: navigation.NavAppId,
        NavId: navigation.NavId,
        Name: navigation.NavName,
        ParentId: navigation.NavParentId,
        PageURL: navigation.NavPageURL,
        Position: navigation.NavPosition,
        Active: navigation.NavActive,
        Desktop: navigation.NavDesktop,
        Tablet: navigation.NavTablet,
        Phone: navigation.NavPhone,
        RoleId: navigation.NavRoleId,
        Target: navigation.NavTarget
      }
    })
  })
)

2 个答案:

答案 0 :(得分:1)

RxJS在内部仅使用Javascript函数,每个运算符都是一个javascript函数,您可以使用JS Function创建自定义RxJS运算符。假设您正在使用map运算符,它将接收可观察到的输入,执行转换并返回一个可观察的。

您可以使用Javascript映射运算符,这是一个很好的选择。没有看到任何特定于forEach的Rxjs运算符。

答案 1 :(得分:1)

如果您不想仅使用RxJS运算符使用Array的map方法,则可以利用mergeMap需要返回{{1}的函数作为参数的事实},而数组是ObservableInput

在这种情况下,ObservableInput的作用是将数组展平并发出其单个项(mergeMap也称为mergeMap)。

最后,由于您需要flatMap发出一个数组,因此可以使用运算符this.myObservable$

代码看起来像这样

toArray

老实说,使用数组this.myObservable$ = of(json).pipe( mergeMap(data => data), map((navigation) => { return <INavigation> { Id: navigation.Id, AppId: navigation.NavAppId, NavId: navigation.NavId, Name: navigation.NavName, ParentId: navigation.NavParentId, PageURL: navigation.NavPageURL, Position: navigation.NavPosition, Active: navigation.NavActive, Desktop: navigation.NavDesktop, Tablet: navigation.NavTablet, Phone: navigation.NavPhone, RoleId: navigation.NavRoleId, Target: navigation.NavTarget } }), toArray() ) 方法的原始解决方案看起来更简单,更精简。