2017-09-13 59 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);