Rxjs 使用观测值合并子阵列

Rxjs 使用观测值合并子阵列,rxjs,observable,angular2-observables,Rxjs,Observable,Angular2 Observables,我有这样的数据结构: [{ id : 1, name : "Item 1", subItems : [{ id : 1, name : "SubItem 1" },{ id : 2, name : "SubItem 2" } ] }, { id : 2, name : "Item 2", subItems : [{

我有这样的数据结构:

[{
    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"
        }
    ]
}]
我对web服务进行以下调用以获取项目:
this.dataService.get(“项目”)

返回的是可观察的
。我可以使用哪些可观察运算符来仅获取子项的串联列表?我想以这样的方式结束:

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

我是否应该使用类似于
flatMap
concat

的东西,前提是它是一个打字错误,并且第二个元素也有
子项
(而不是
searchProfiles
),您不需要flatMap或任何类似的东西,您可以使用js数组操作符在普通映射中执行:

var transformed = [].concat(...result.map(item => item.subItems));
还是你的情况

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

如果故意使用不同的键,您的内部映射将需要更多的逻辑,但映射将完全相同,前提是它是一个打字错误,并且第二个元素也有
子项(而不是
搜索配置文件
),您不需要flatMap或任何类似的东西,您可以使用js数组运算符在普通映射中执行此操作:

var transformed = [].concat(...result.map(item => item.subItems));
还是你的情况

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

如果有意使用不同的键,您的内部映射将需要更多的逻辑,但映射将与您希望首先使用
map()
操作符提取所需的字段并使用
concatAll()将对象数组展平的映射完全相同(这是高阶观测值的一个小技巧,有关更多信息,请参阅):

这将打印到控制台:

{ id: 1, name: 'SubItem 1' }
{ id: 2, name: 'SubItem 2' }
{ id: 3, name: 'SubItem 3' }
{ id: 4, name: 'SubItem 4' }
或者,如果您确实希望将输出作为单个数组,则可以在
.concatAll()
之间添加
toArray()
运算符。订阅(…)
,您将收到:

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

您希望首先使用
map()
操作符仅提取所需的字段,并使用
concatAll()
将对象数组展平(这是高阶观测值的一个小技巧,有关更多信息,请参阅):

这将打印到控制台:

{ id: 1, name: 'SubItem 1' }
{ id: 2, name: 'SubItem 2' }
{ id: 3, name: 'SubItem 3' }
{ id: 4, name: 'SubItem 4' }
或者,如果您确实希望将输出作为单个数组,则可以在
.concatAll()
之间添加
toArray()
运算符。订阅(…)
,您将收到:

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

是结果(完整结果)一个数组?从你写它的方式来看还不清楚,你是否故意混合了子项和搜索配置文件?…源应该是一个数组吗?@Meir它是一个类型,应该是两个的子项。结果应该是一个数组,是的。我想是这样。请看我下面的解决方案,你可以使用js数组函数而不使用n进一步使用的eed RxJS是结果(完整结果)一个数组?从你写它的方式来看还不清楚,你是否故意混合了子项和搜索配置文件?…源应该是一个数组吗?@Meir它是一个类型,应该是两个的子项。结果应该是一个数组,是的。我想是这样。请看我下面的解决方案,你可以使用js数组函数而不使用n需要进一步使用RxJS困扰我的是,我在
map
中得到了包含两个项目的整个数组,而不是像你的例子中的每个项目。在你的例子中,我猜可观测对象分别发射每个项目?但我的情况是,整个数组返回并发射一次,所以这就是我在
map
@Joel中得到的因为我使用的是
Observable.from(data)
。如果你使用的是
Observable.of(data)
,你将把它作为一个大数组来接收。好的。然后我将不得不做一些类似
.map(items=>{let subItems=[];items.forEach(item=>subItems.push(item.subItems));return subItems;)的事情。尽管语法可能有点偏差:)@Joel你为什么需要它?如果使用(数据)的
Observable.of
我需要这样做才能得到我想要的结果。但是谢谢你,这帮了我的忙。让我头疼的是,我在
map
中用两个项目而不是每个项目获得整个数组,就像在你的例子中一样。在你的例子中,可观测对象分别发射每个项目,我猜?但在我的例子中,整个数组返回一个nd发出一次,这就是我在
map
@Joel中得到的,因为我使用的是
Observable.from(data)
。如果你使用
Observable.of(data)
,你将把它作为一个大数组来接收。好的。然后我必须做一些类似
.map(items=>{let subItems=[];items.forEach(item=>subItems.push)的事情(item.subItems));return subItems;)
?语法可能有点离题:)@Joel为什么需要它?如果使用
Observable.of(data)
我需要这样做才能得到我想要的结果。但是谢谢你,这对我有帮助。