Rxjs 用.map变换可观测数据

Rxjs 用.map变换可观测数据,rxjs,observable,Rxjs,Observable,我在转换可观察对象时遇到问题。详情如下: 我有这样的数据 [ { “名字”:“约翰”, '姓':'现金', 年龄:20岁 } ]; 然后,我从api中获取以下数据: public getData():可观察{ 返回此.http.get('xxx') .地图( response=>response.json() ); } 然后,我尝试订阅以下内容: this.service.getData.subscribe( (res)=>this.data=res ); 没关系,它起作用了。但我需要修改

我在转换可观察对象时遇到问题。详情如下:

我有这样的数据

[
{
“名字”:“约翰”,
'姓':'现金',
年龄:20岁
}
];
然后,我从api中获取以下数据:

public getData():可观察{
返回此.http.get('xxx')
.地图(
response=>response.json()
);
}
然后,我尝试订阅以下内容:

this.service.getData.subscribe(
(res)=>this.data=res
);
没关系,它起作用了。但我需要修改对象的结构,我想使用.map将接收到的对象转换为此架构:

[
{
“名字”:“约翰”,
'姓':'现金',
年龄:20岁,,
“newProperty”:“value”
}
];
。。而且对我来说没什么用即使我不想添加新属性,但要修改例如firstName上的值:

.map(
返回x=>x[0]。firstName='asd'
)

它不起作用(类型“string”不能分配给类型“Data[]”,我知道它的意思,但我不知道怎么做,我的错误在哪里?

您必须创建该类型的对象,例如如下所示

.map((res:Response)=>res.json().map(obj=>newmyobject(obj.id,obj.name)))

可观测的映射算子和数组的映射方法有区别。您希望将HTTP请求的结果转换为数组,然后对该数组的每个成员应用一些额外的转换。让我们一步一步走

this.http.get(“…”)
这将返回可观察对象,该对象保存angular的Http服务的响应。要利用其中的数据,必须调用Response的json()方法

.pipe(
map((response:response)=>response.json())
)
这段代码的意思是“当被观察者发送一些数据时,将其放入一个处理管道。将其视为HTTP响应,并将其内容提取为JSON,然后将其放在另一个可观察的位置。因此,如果您订阅它,您将获得您的数组

然后你可以用这个规则数组做任何事情,比如使用它的map方法。让我用我自己的例子,虽然它与你的非常相似

this.http.get(“…”)
.pipe(map((response:response)=>response.json())
.subscribe((数组:Person[])=>{
让modifiedArray=array.map((项:any)=>{
item.newProperty='value';
}
this.persons=darray;
});
或者,如果愿意,请在订阅之前操作数组项:

const modifiedData$:Observable=this.http.get(“…”).pipe(
map((response:response)=>response.json()),
地图((数组:Person[])=>{
返回数组.map((项目:个人)=>{
item.newProperty='value';
}
)};
管道中的两个连续贴图操作符可以替换为一个:

const modifiedData$:Observable=this.http.get(“…”)
.pipe(映射)(响应:响应)=>{
返回response.json().map((item:Person)=>{
item.newProperty='value';
}
});
modifiedData$.subscribe((个人:个人[])=>{
this.persons=darray;
});
如果您觉得太冗长,这里有一个更简洁(但可读性较差)的版本:

this.http.get(“…”)
.pipe(map(response=>response.json().map(item=>item.newProperty='value'))
.subscribe(persons=>this.persons=persons);

i在重新调整之前,您需要创建该类型的对象,但不创建新对象?例如,使用该数据创建全新的对象数组(无类型)使用新属性?可能使用扩展函数。可能它没有任何意义。或者可能我不需要修改结构,可能有可能添加变量。映射并复制每个可观察元素的不同值?例如,新变量将是fullName,包含来自firstName和LastName的数据。除了p函数在Observable上不存在。不知道我有什么版本的rxjs。从rxjs的5.5版开始,像
map
这样的操作符就变成了纯函数,应该在管道中使用。编辑了我的答案。啊,是的,用管道做也对我有用。我忘了在这里放一些关于工作的东西。@Anton Rusak,你介意看一看吗我也有类似的想法。我尝试了上面的解决方案,但效果并不理想。