我对此有点陌生,所以请耐心等待。我会尽力解释。我正在使用 AngularFire2 并将数据作为列表检索。就我而言,我正在尝试获取与帐户关联的交易列表(请参阅下面的示例数据)。
样本数据
accounts: {
account1: {
name: "Account 1",
transactions: {
transaction1: {
date: somedate
},
transaction2: {
date: somedate
}
}
}
}
transactions: {
transaction1: {
name: "Transaction 1"
},
transaction2: {
name: "Transaction 2"
},
transaction3: {
name: "Transaction 3"
}
}
我的第一步是从账户中获取交易列表:
af.database.list('/accounts/account1/transactions');
这给了我一个可观察的对象数组,如下所示:
[Object, Object]
然后我想用交易节点的实际交易细节完全替换这两个对象。所以是这样的:
af.database.list('/accounts/account1/transactions')
.map(res => {
return res.map(items => {
return af.database.list('/transactions/items.$key');
})
})
这种排序让我得到了我想要的,除了我现在有一个可观察的可观察数组而不是像这样的对象:
[Observable, Observable]
只要我像这样使用 async 和 Elvis 运算符,我就可以让它在我的模板中工作:
<ul>
<li *ngFor="let transaction of transactions | async">{{ (transaction | async)?.name }}</li>
</ul>
我还需要将帐户名称作为每个对象或可观察对象的一部分,因此我最终将其更改为如下内容:
af.database.list('/accounts/account1/transactions')
.map(res => {
return res.map(transaction => {
transaction.details = af.database.list('/transactions/' + transaction.$key);
transaction.account = af.database.list('/accounts/' + accountKey);
})
})
好的,所以这确实有效,但现在我想转换这些数据,以便我的服务返回更简洁的内容。您在下面的示例数据中看不到的是,交易和账户中的每一个都有更多的数据点。我不需要也不想要响应中的那些,所以我想稍微清理一下。最后,我想用一个可观察的对象数组来响应,就像最初的 angularfire2 调用一样。现在我有一个可观察的对象数组,如下所示:
{
date: somedate,
details: Observable,
account: Observable
}
我真的很想拥有更多这样的东西:
{
date: somedate,
name: "Transaction 1",
accountName: "Account 1"
}
因此,我需要弄清楚如何从这些可观察值中获取值,并且我正用头撞墙试图弄清楚。有人有什么建议吗?我确定我在这里遗漏了一些简单的东西。
我发现的大多数解决方案都建议使用 flatMap 或 concatMap,但这最终给了我一个可观察的单个对象,而不是一个包含对象的可观察数组。