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)
我需要这样做才能得到我想要的结果。但是谢谢你,这对我有帮助。