2017-09-13 13 views
1

私は観測値を変換する際に問題があります。下記の詳細:.mapで観測可能

私はその後、私はAPIからこのデータを取得し、この

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

のようなデータを持っている:

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

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

その後、私はこれをサブスクライブしようとしています

これは問題ありません。しかし、私は、オブジェクトの構造を変更する必要があると私は、このスキーマに受信したオブジェクトを変換するために.MAP使用したい:

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

...と私のために働い何..:/私はしたくない場合でも、新しいプロパティを追加しますが、例えば上の値を変更するのfirstName:「それは働いていない

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

(タイプ「string」は「データは[]」、私が知っている、それが何を意味するのか型に代入ではありませんが、私はドン私のミスはどこですか?)

+0

retuningする前にそのタイプのオブジェクトを作成する必要があります –

+0

しかし、新しいオブジェクトを作成しないでください?たとえば、新しいプロパティを持つデータ(型なし)を持つオブジェクトの完全な新しい配列を作成することによって、たぶん普及機能あり。たぶんそれは意味がありません.. 多分私は構造を変更する必要はありません、おそらく.mapに変数を追加し、observableの各要素に異なる値をコピーする可能性がありますか? – Przemo

+0

例えば、新しい変数は、firstNameとLastNameのデータを持つfullNameになります。 – Przemo

答えて

0

あなたはそのタイプのオブジェクトを以下のように作成する必要があります

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

観察可能でマップ演算子と配列のマップオペレータ間の違いがあります。 HTTPリクエストの結果を配列に変換し、その配列のすべてのメンバーに追加の変換を適用したいとします。

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

角度のHttpサービスの応答を保持するObservableオブジェクトを返します。内部のデータを利用するには、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'; 
    } 
}; 

2つの連続したマップ:それはあなたにあまりにも長ったらしいなら

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); 
関連する問題