Unisci sottoarray usando Observables

Ho questa struttura dati:

[{ id : 1, name : "Item 1", subItems : [{ id : 1, name : "SubItem 1" },{ id : 2, name : "SubItem 2" } ] }, { id : 2, name : "Item 2", subItems : [{ id : 3, name : "SubItem 3" }, { id : 4, name : "SubItem 4" } ] }] 

Faccio la seguente chiamata a un servizio Web per ottenere gli articoli: this.dataService.get("items")

Returned è un Observable . Quali operatori osservabili posso utilizzare per ottenere solo un elenco concatenato di SubItem? Mi piacerebbe finire con qualcosa di simile:

 [{ id : 1, name : "SubItem 1" }, { id : 2, name : "SubItem 2" }, { id : 3, name : "SubItem 3" }, { id : 4, name : "SubItem 4" }] 

Dovrei usare qualcosa come flatMap o concat ?

A patto che sia un refuso e il secondo elemento abbia anche subItems (e non searchProfiles ), non hai bisogno di flatMap o di qualcosa del genere, puoi farlo in una mappa semplice usando gli operatori di js array:

 var transformsd = [].concat(...result.map(item => item.subItems)); 

o nel tuo caso

 httpResult$.map(result => [].concat(...result.map(item => item.subItems)) 

se l’uso di chiavi diverse è intenzionale, la tua mappa interna richiederà un po ‘più di logica, ma la mapping sarà praticamente la stessa

Vuoi prima map() operatore per estrarre solo i campi che ti servono e appiattire gli array di oggetti con concatAll() (è un piccolo trucco con gli osservabili di ordine superiore, vedi Sottoscrizione ad un osservabile annidato per maggiori informazioni):

 var data = [{ id : 1, name : "Item 1", subItems : [ { id : 1, name : "SubItem 1" }, { id : 2, name : "SubItem 2" } ] }, { id : 2, name : "Item 2", searchProfiles : [ { id : 3, name : "SubItem 3" }, { id : 4, name : "SubItem 4" } ] }]; Observable.from(data) .map(item => { if (item.searchProfiles) { return item.searchProfiles; } else if (item.subItems) { return item.subItems } }) .concatAll() .subscribe(val => console.log(val)); 

Questo stampa per console:

 { id: 1, name: 'SubItem 1' } { id: 2, name: 'SubItem 2' } { id: 3, name: 'SubItem 3' } { id: 4, name: 'SubItem 4' } 

In alternativa, se si desidera realmente l’output come singolo array, è ansible aggiungere l’operatore .concatAll() tra .concatAll() e .subscribe(...) e si riceverà:

 [ { id: 1, name: 'SubItem 1' }, { id: 2, name: 'SubItem 2' }, { id: 3, name: 'SubItem 3' }, { id: 4, name: 'SubItem 4' } ]