当数组中的单个对象时,Angular2 Array.prototype.map()失败

时间:2017-07-16 11:25:29

标签: json angular typescript

当响应在Json数组中返回多于1个对象时,下面的代码工作正常。注意,期望的Json结构是属性字段" address"引用的Address对象数组。换句话说,(addresses.address)下面引用一个数组。

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);    

}

当只找到一个地址时,响应返回带有单个Address对象的Json。但是我在运行时遇到错误。

  

TypeError:addresses.address.map不是函数

返回的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"
  }
}

上述运行时错误的原因是什么?

2 个答案:

答案 0 :(得分: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;
   })
}

答案 1 :(得分:1)

正如我们所看到的,如果它只返回一个对象,那么你获得的JSON实际上是一个对象而不是一个数组,我们不能在一个Object上使用map。由于它适用于多个对象,我假设你的JSON响应然后返回一个带有数组的对象address

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

所以我们可以做的是检查响应是否确实是一个数组,如果是,那么做映射。如果没有,那么只需将响应转换为与您的类匹配的对象。为了保持一致性,我认为你想要返回数组中的单个对象(?)以避免类型不匹配,所以做这样的事情:

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;
   })
}