改变嵌套的可观察值

Alter nested observable values

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 
}

我只会return行下的两个文档给订阅者。

但是 map 函数似乎没有像我预期的那样工作,因为 undefined 是 returned.

我预计 [ {a: 2}, {a: 1} ]

我找到了解决方案:

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

但希望有更短的路!?

pluck('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 后面的 pluck 可以简化为一个操作:

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

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