Angular - HttpClient: Map Get method object result to array property Angular - HttpClient: Map Get method object result to array property arrays arrays

Angular - HttpClient: Map Get method object result to array property


You can simply .map() your http call, which is an Observable, to return the data type that you want.

findAllShows(): Observable<Show[]> {    return this.http        .get(`${someURL}/shows`)        .map(result=>result.shows)}

Your httpClient.get() should return an Observable, which you have explicitly stated it thought Observable<Show[]>. You .map() is an operator that transform the observable into a new one.

More on .map() operator: http://reactivex.io/documentation/operators/map.html

Update:

For RXJS version 6 and above, simply use .pipe() to pipe the .map() operator:

findAllShows(): Observable<Show[]> {    return this.http        .get(`${someURL}/shows`)        .pipe(map(result=>result.shows))}


Latest HttpClient which should be used instead of http has no map method. You should first import it by import { map } from 'rxjs/operators';Then you should use it this way:

this.http.get(`${someURL}/shows`).pipe(        map(res => res['shows'])    )


Thanks All,I was able to find solution by combining responses from @ Arun Redhu by providing a transfer object interface that the server sends back. Then solution provided by @CozyAzure by using the .map() to transform one Observable to the correct Observable Show[].

Full Solution below for those interested.

import {Observable} from 'rxjs/Observable';import {Contact} from '../models/show';import {environment} from '../../../environments/environment';// Use the new improved HttpClient over the Http// import {Http, Response} from '@angular/http'; import {HttpClient} from '@angular/common/http';// Create a new transfer object to get data from serverinterface ServerData {  shows: Show[];}@Injectable()export class ShowsService {  constructor(private http: HttpClient ) { }// want Observable of Show[]  findAllShows(): Observable<Show[]> {      // Request as transfer object <ServerData>    return this.http      .get<ServerData>(`${apiURL}/shows`)     // Map to the proper Observable I need       .map(res => <Show[]>res.shows);   }}

All great now!!! Thanks . So depending on data returned I can either use directly or map to proper Observable I need.