2017-02-15 13 views
5

我有一個json結果,它是對象的集合。我需要將它們轉換爲具有與json結果不同屬性名稱的自定義對象的集合。在這種情況下也不是所有的結果屬性都需要。如何使用不同屬性名稱的json對象的可觀察地圖集合

JSON

[{"empID":"12345", "formattedName":"Simpson, Homer"}, 
{"empID":"24680", "formattedName":"Simpson, Marge"}, 
{"empID":"36912", "formattedName":"Simpson, Bart"}, 
{"empID":"13579", "formattedName":"Simpson, Lisa"}, 
{"empID":"13579", "formattedName":"Simpson, Lisa"}] 

我的自定義Ojbect

export class multiSelect { 
    constructor(
    public id: string, 
    public name: string 
) { } 
} 

服務

reportsTo(): Observable<multiSelect> { 
    return this._http.get('getCollection') 
     .map((response: Response) => response.json()) 
     .map(({empID, formattedName}) => new multiSelect(empID, formattedName)) 
     .catch(this.handleError); 
    } 

我想爲我的SE服務返回此

[{"id":"12345", "name":"Simpson, Homer"}, 
{"id":"24680", "name":"Simpson, Marge"}, 
{"id":"36912", "name":"Simpson, Bart"}, 
{"id":"13579", "name":"Simpson, Lisa"}, 
{"id":"13579", "name":"Simpson, Lisa"}] 

任何幫助,將不勝感激。謝謝。

+0

你可以添加一個解釋,說明你當前的代碼是不是做你想做的事情嗎?編譯器是否給你一個錯誤?運行時是否拋出異常?它是否給出不同於你想要它返回的輸出? – StriplingWarrior

回答

1

你可以像這樣的數據映射到類:

reportsTo() { 
    return this._http.get('getCollection') 
    .map((response: Response) => response.json().map(res => new multiSelect(res.empID, res.formattedName))) 
    .catch(this.handleError); 
    } 

這應該做你想要什麼。希望這可以幫助! :)

0

我建議創建的multiSelect類中的方法:

export class multiSelect { 
    constructor(
    public id: string, 
    public name: string 
) { } 
    fillWithData(data){ //this function receive your json 
     this.id = data.empID; 
     this.name = data.formattedName; 
    } 
} 

然後,JSON.strigify(multiSelectInstance)會做的伎倆。

如果你想使用構造,所以你只需要一個電話,你可以進行以下保持:

export class multiSelect { 
    constructor(
    public id: string, 
    public name: string, 
    public data 
) { 
     this.id = data.empID; 
     this.name = data.formattedName; 
    } 
    fillWithData(data){ //this function receive your json 
     this.id = data.empID; 
     this.name = data.formattedName; 
    } 
} 
0

可能更容易改變你的服務,這樣的事情:

reportsTo(): Observable<multiSelect> { 
    return this._http.get('getCollection') 
    .map((response: Response) => response.json()) 
    .map(({empID, formattedName}) => ({id: empID, name: formattedName})) 
    .catch(this.handleError); 
} 

然後擺脫你的multiSelect類,而是用接口替換它。

export interface multiSelect { 
    id: string; 
    name: string; 
} 

打字稿將強制返回觀察到有,因爲界面的正確格式的數據,現在你不必處理類或構造函數。

+0

想用這種方法去,但我得到紅色波浪線(TS錯誤)下id和empID。像「[ts] unused labe1」和「[ts]逗號運算符左側的錯誤分別是未使用且無副作用」。 – Brian

+0

對不起,我的錯誤是,語法有點不合適,我在寫完之後沒有進行測試。編輯的答案應該可以工作。 – Adam

相關問題