【发布时间】:2018-10-02 09:50:50
【问题描述】:
我正在尝试将来自 API 调用的响应映射到比方说 Product 对象。我似乎无法找到正确执行此操作的方法。
响应的结构如下:
{
"data": [
{
"id": 1,
"name": "keyboard",
"details": {
"parent": 1,
"price": 50,
"other": "info"
}
},
{
"id": 2,
"name": "mouse",
"details": {
"parent": 2,
"other": "info",
"price": 20
}
}
],
"total-records": 2,
"more": "something"
}
无法保证响应详细信息的顺序。 (详细注意价格)。我正在尝试将上面的对象映射到一个仅包含以下属性的新对象:
{
"id": 1,
"name": "keyboard",
"price": 50
},
{
"id": 2,
"name": "mouse",
"price": 20
}
我正在使用 angular 和 Observables 来获取数据。现在我正在获取值,对其进行映射,并且可以获取详细信息或第一级对象属性,例如data.id 或data.name。然而,获取价格等细节让我有点困惑。
我已经研究了很多关于 mergemap、flatmap 甚至 lodash 以及无数小时试图弄清楚但我似乎无法找到正确的方法来做到这一点。
我可以在地图组合中使用过滤器来实现这一点吗? 任何信息都非常感谢。
到目前为止,这是我的代码:
ngOnInit() {
//Get by criteria
this.productService
.get(url, httpOptions)
.pipe(
map((items: Response<Product>) => {
this.details = items["details"].filter(
// Filter possible null values
details=> details!==null;
);
this.header = items
}),
tap(() => console.log(this.header))
)
.subscribe();
}
// Header is level 1 info like name and id
// Detail is level 2 info like price.
// I have to have a filter on the details because sometimes
【问题讨论】:
-
在尝试回答之前:您没有从答案中捕获“数据”属性,所以我真的不明白您想要做什么。您将“详细信息”视为一个数组(使用过滤器),但它是一个对象。您希望将结果放入一个新对象(但没有属性),所以我想它是一个数组(产品数组?)
-
你是对的,生成的新对象是一个产品数组
标签: angular typescript mapping observable rxjs6