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());
但是希望有一个更短的方法!?
答案 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()
运算符,它不是类型安全的。