Объединить подмассивы с помощью Observables

У меня есть эта структура данных:

[{ 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" } ] }] 

Я делаю следующий вызов веб-службы для получения элементов: this.dataService.get("items")

Возвращено является Observable . Какие операторы Observable я могу использовать, чтобы получить только конкатенированный список SubItems? Я хотел бы получить что-то вроде этого:

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

Должен ли я использовать что-то вроде flatMap или flatMap ?

При условии, что это опечатка, а во втором элементе тоже есть subItems (а не searchProfiles ), вам не нужна flatMap или что-то в этом роде, вы можете сделать это на простой карте с использованием операторов массива js:

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

или в вашем случае

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

если использование разных ключей преднамеренно, ваша внутренняя карта потребует немного больше логики, но сопоставление будет совершенно одинаковым

Вы хотите, чтобы первый оператор map() извлекал только нужные вам поля и сглаживал массивы объектов с помощью concatAll() (это небольшой трюк с более высоким порядком Observables, см. « Подписка на вложенный наблюдаемый» для получения дополнительной информации):

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

Это выводится на консоль:

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

В качестве альтернативы, если вы действительно хотите, чтобы результат был одним массивом, вы можете добавить оператор toArray() между .concatAll() и .subscribe(...) и вы получите:

 [ { id: 1, name: 'SubItem 1' }, { id: 2, name: 'SubItem 2' }, { id: 3, name: 'SubItem 3' }, { id: 4, name: 'SubItem 4' } ] 
Давайте будем гением компьютера.