2017-07-16 9 views
0

応答がJson配列の1つ以上のオブジェクトを返すとき、以下のコードは正常に動作します。 Json構造体は、プロパティフィールド "address"によって参照されるAddressオブジェクトの配列であることに注意してください。つまり、以下の(addresses.address)は配列を参照します。Angular2配列内の単一オブジェクトが0のときにArray.prototype.map()が失敗する

public getAddressByPersonName(personName: string): Observable<Address[]> { 
    return this.http 
    .get(API_URL) 
    .map(response => { 
     const addresses = response.json(); 
     if (addresses) 
     return (addresses.address).map((address) => new Address(address)); 
     return null; 
    }) 
    .catch(this.handleError);  

}

1つのアドレスだけが見つかった場合、応答は、単一のアドレスオブジェクトにJSONを返します。しかし、私は実行時にエラー以下になる。

TypeError: addresses.address.map is not a function

JSON文字列が返されます。

{ 
    "address": { 
    "addressId": "1", 
    "addressLine1": "5 Bayberry Close", 
    "personName": "Dr John", 
    "route": { 
     "routeId": "100", 
     "routeName": "45 Main Street", 
     "updateBy": "admin", 
     "updateDate": "2017-07-03T17:48:33-04:00" 
    }, 
    "updateBy": "admin", 
    "updateDate": "2017-07-03T18:10:27-04:00" 
    } 
} 

上記のランタイムエラーの原因は何ですか?

+3

をマップメソッド?戻ってきたJSONを見ましたか? – jonrsharpe

+0

あなたが得ているJSONを投稿してください –

+0

返されたJSONが追加されました。したがって、関数は、単一の対複数のアイテムが返される両方を処理するように変更する必要がありますか? – Nirmal581

答えて

1

私は正しくオブジェクトをマップしようとしていますが、map functionは配列用です。
あなたができることは、指定された応答が期待される配列の応答であるかどうかをチェックし、配列がすでにある場合には配列の中にオブジェクトをラップすることです。以下のように

getAddressByPersonName() { 
    return this.http.get(API_URL) 
    .map(response => { 
     const addresses = response.json(); 
     if (addresses) { 
     if(!Array.isArray(addresses.address)) { 
      addresses.address = [addresses.address] 
     } 
      return (addresses.address).map((address: Address) => new Address(address)); 
     }   
     return null; 
    }) 
} 
+0

このリンクは質問に答えるかもしれませんが、ここに答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 16733634) – iehrlich

+0

ありがとう更新されました:) –

1

を、私たちが見ることができるように、それだけで一つのオブジェクトを返すなら、あなたが取得しているJSONは、実際にはオブジェクトではなく配列であり、我々は、オブジェクトの上にmapを使用することはできません。それはいくつかのオブジェクトのために働くので、私は、あなたのJSONレスポンスを想定して、配列とオブジェクトaddressを返します。

{ 
    "address": [{ ... }, { ... }] 
} 

それでは、私たちが行うことができ、応答が実際配列であるかどうかをチェックされ、もしそうであれば、マッピングを行います。そうでない場合は、クラスに一致するオブジェクトにレスポンスをキャストします。 (?)の一貫性のために私はタイプmissmatchesを避けるために、あなたは配列内の単一のオブジェクトを返すようにしたいと思いますので、このような何か:その場合には、それは配列ではありませんので、それは持っていないので、

getAddressByPersonName() { 
    return this.http.get(API_URL) 
    .map(response => { 
     const addresses = response.json(); 
     if (addresses) { 
     if(Array.isArray(addresses.address)) { 
      return 
       (addresses.address).map((address: Address) => new Address(address)); 
     } else { 
      return [new Address(addresses.address)] 
     } 
     }   
     return null; 
    }) 
} 
+0

このソリューションもうまくいくでしょう。私はそれをテストしました。しかし、返されたjsonを変更し、同じ戻り呼び出しを使用するため、私は他の解決策を受け入れました。これにより、バックエンドサービスからjsonを返却したときの元の問題がより明確に強調され、2つの形式で表示されます。 – Nirmal581

+0

@ Nirmal581はい、受け入れる答えは全くあなたの選択です。私は受け入れられた答えの著者がもともとその答えを提供していたならば、私は答えを書いていないでしょう、今、それはほぼ正確にそのように見えますが、私はここにそれを残すでしょう:P – Alex

関連する問題