更改嵌套的可观察值

时间:2018-07-31 12:15:34

标签: angular observable rxjs6

return this.http.get(environment.remoteUrl + '/client').pipe(pluck('rows'), map((i: any) => i.doc));

我以以下结构获取数据:

{ 
   rows: [
       {x: 123, doc: {a: 2}}, 
       {x:222, doc: {a: 1}}
   ], 
   c: 'hello', 
   b: 3 
}

我只会将行下的两个文档都退还给订阅者。

但是似乎map函数没有按我预期的那样工作,因为返回了undefined。

我希望[ {a: 2}, {a: 1} ]

我找到了解决方法:

.pipe(pluck('rows'), flatMap((i: any) => i), map((i: any) => i.doc), toArray());

但是希望有一个更短的方法!?

1 个答案:

答案 0 :(得分:2)

pluck('rows'), 

这会将每个发出的事件转换成其rows属性。所以会发出

[
   {x: 123, doc: {a: 2}}, 
   {x:222, doc: {a: 1}}
]

您现在想将此数组转换为仅包含

的另一个数组
[ {a: 2}, {a: 1} ]

因此,您需要一个map运算符,并且此map运算符必须将一个数组转换为另一个数组。可以使用Array.map()

map(arrayOfXAndDocs => arrayOfXAndDocs.map(xAndDoc => xAndDoc.doc))

定义结构的类型并使用它们而不是使用any并使用可理解的名称而不是i会很有帮助。

请注意,映射后的弹拨可以减少为单个操作:

map(objectWithRows => objectWithRows.rows.map(xAndDoc => xAndDoc.doc))

这避免了丑陋的pluck()运算符,它不是类型安全的。

相关问题