2017-09-13 32 views
1

我在转换我的observable时遇到问题。详情如下:使用.map转换Observable使用.map

我有这样

[ 
    { 
     'firstName': 'John', 
     'lastName': 'Cash', 
     'age': 20 
    } 
    ]; 

数据然后我从API得到这样的数据:

public getData(): Observable<Data[]> { 
    return this.http.get('xxx') 
    .map(
     response => response.json() 
    ); 
    } 

然后,我想这订阅:

this.service.getData.subscribe(
     (res) => this.data = res 
    ); 

而且没关系,它正在工作。但我需要修改对象的结构,我想用.MAP收到的对象转变为这个模式:

[ 
    { 
     'firstName': 'John', 
     'lastName': 'Cash', 
     'age': 20, 
'newProperty': 'value' 
    } 
    ]; 

..并没有为我工作..:/就算我不想增加新的属性,但在例如修改值姓:

.map(
    return x => x[0].firstName = 'asd' 
) 

它不工作(类型“字符串”是不能分配给类型“数据[]”,我知道这意味着什么,但我不” t知道该怎么做,我的错误在哪里?)

+0

我在重新调整之前变薄需要创建该类型的对象 –

+0

但是不创建新的对象?例如通过使用新属性创建具有该数据的全新对象数组(不带类型)?也许与传播功能。也许它没有任何意义.. 或者,也许我不需要修改结构,也许有可能将变量添加到.map并为每个可观察元素复制不同的值?例如, – Przemo

+0

新变量将是fullName与来自firstName和LastName的数据。 – Przemo

回答

0

您必须创建该类型的对象,例如下面的例子

.map((res: Response) => res.json().map(obj => new MyObject(obj.id, obj.name))) 
2

地图运营商之间在可观察和地图操作者在阵列的差。您想要将HTTP请求的结果转换为数组,然后对该数组的每个成员应用一些额外的转换。

this.http.get('...') 

这将返回可观察对象,用于保存角的HTTP服务的响应。要使用它里面的数据,你必须调用Response的json()方法。

.map((response:Response) => response.json()) 

该代码表示​​“时可观察到的发送一些数据,把它作为HTTP响应,并提取其内容作为JSON,然后把另一个可观测”。所以如果你订阅它,你会得到你的数组。您可以使用该常规数组执行任何操作,例如使用地图运算符。让我使用我自己的例子,尽管它和你很相似。

this.http.get('...') 
.map((response:Response) => response.json()) 
.subscribe((array:Person[]) => { 
    let modifiedArray = array.map((item:any) => { 
      item.newProperty = 'value'; 
    } 

    this.persons = modifiedArray; 
}); 

或者,如果你喜欢,订阅前处理数组项:

let modifiedData$:Observable<Person> = this.http.get('...') 
.map((response:Response) => response.json()) 
.map((array:Person[]) => { 
    return array.map((item:Person) => { 
      item.newProperty = 'value'; 
    } 
}; 

两个连续地图不需要运营商:

let modifiedData$:Observable<Person[]> = this.http.get('...') 
.map((response:Response) => { 
    return response.json().map((item:Person) => { 
      item.newProperty = 'value'; 
    } 
}; 

modifiedData$.subscribe((persons:Person[]) => { 
    this.persons = modifiedArray; 
}); 

如果它太罗嗦你,这里是一个更紧凑(但不太可读)的版本:

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