typescript - 高效映射 RXJS 可观察对象
问题描述
我有两个不同的对象数组,如何重新分配对象属性数组。
使用键标记:
export interface ProductData
{
key:string,
name:string
}
productData:[
{key:'index1',name:'invoice'},
{key:'index2',name:'Multi'}
];
使用名称来赋值:
export interface filterOptions{
label:string;
value:string;
}
以下是我如何处理来自我的服务的结果调用:
this.myService.getProctResponse.subscribe(response=>{
this.filterOptions[0].label = response.productData[0].key;
this.dfilterOptions[0].value = response.productData[0].name;
this.filterOptions[1].label = response.productData[1].key;
this.filterOptions[1].value = response.dproductData[1].name;
});
这有效(解决方案 1),但我必须提供每个值的索引才能映射它。
我宁愿做这样的事情:
this.productData.map(items=>{
this.filterOptions.value= items.name
this.filterOptions.label = items.key
});
问题:它将最后一个值作为对象推送,并且不提供对象数组。
这种方法比解决方案 1(上图)效果更好,但是我可以使用更好的方法吗?
response.productData.forEach((item, index) => {
let list :FilterModel = {
label:item.key,
value:item.name
};
this.filterOptions.push(list);
});
我的问题仍然需要将 key 属性映射到 label 属性,并将 name 属性映射到 value 属性。
预期的o / p:
[{label:'index1',value:'invoice'},
{label:'index2',value:'multi'},
{label:'index3',value:'single'},
{label:'index4',value:'handy'},etc];
解决方案
正如您所指出的,由于多种原因,必须专门绑定到响应中的索引值是笨拙且不可行的。如果响应数组包含两个以上的对象怎么办?如果它包含更少怎么办?
但正如您还注意到的,您确实需要在不同接口的每个属性之间进行映射。因为您正在使用 RXJS 来处理来自远程调用的值,所以我建议您稍微简化一下以在您的可观察进程中运行映射,如下所示:
this.myService.getProctResponse.pipe(
map(x => {
let models: Array<FilterModel> = [];
x.forEach(y => {
let model: FilterModel = {
label: y.key,
value: y.name
};
models.push(model);
});
return models;
})
).subscribe(mappedResponse => {
//Do something with it
});
它只是结合了您已经拥有的一些想法,但将其放入 pipe 方法中,以便仅当 observable 通过它推送任何数据时才计算它。和以前一样,您只需订阅它,而不是接收 ProductData[] 并随后处理它,您将收到 FilterModel[] 来分配您需要的位置,从而简化与组件标记的任何依赖关联。
推荐阅读
- openssl - 生成多个具有相同模数的 RSA 密钥
- java - 是什么导致了这个 ArchUnit 异常?
- arangodb - Arango commitIntervalMsec 和solidationIntervalMsec 以减少等待时间
- java - mongoTemplate executeCommand 错误:未授权
- c# - 设置可以注入的填充对象的最佳方法是什么?
- apache-flink - Flink 流式传输:全局窗口何时开始?
- java - Firebase Cloud Storage Java Admin SDK 使用 contentType 上传文件
- oauth-2.0 - 如何在金字塔框架中启用谷歌身份验证?
- vuejs3 - Vue3 将 html 添加到现有项目
- javascript - jest-each 是否提供了一种方法来更多地访问测试描述中传递的参数?