我创建了一些简化的代码来说明我的问题。
我的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
}
})
})
)
答案 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()
)
方法的原始解决方案看起来更简单,更精简。