2017-02-15 5 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)は、トリックを行うだろう。

あなたがコールを1つだけ必要なので、コンストラクタを使用し続けたい場合は、以下を行うことができます。

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

このメソッドを使いたいですが、idとempIDの下に赤い波線(TSエラー)が表示されます。 「[ts] unused labe1」や「[ts]カンマ演算子の左辺は使用されておらず、副作用がありません。 – Brian

+0

申し訳ありませんが、私の間違いは、構文が少しずれていて、私はそれを書いた後にテストしませんでした。編集された回答がうまくいくはずです。 – Adam

関連する問題