Javascript RxJS正在等待嵌套的observable来过滤数组数据
有两个Javascript RxJS正在等待嵌套的observable来过滤数组数据,javascript,firebase,rxjs,angularfire2,reactivex,Javascript,Firebase,Rxjs,Angularfire2,Reactivex,有两个可观察的:foo和bar foo将返回对象的数组,[{id:1},{id:2},…](它将返回整个数组(使用AngularFire.list此处)) bar对从foo返回的每个项目都有一个存储值。该值存储为对象:{id:2,status:false} 这里需要做的是首先调用foo,在它的map函数中,如果bar响应中的匹配值为false,我想从subscribe()方法中取出{id:2} 换句话说 从foo .map对象,并从栏检查每个对象的状态 bar返回值为true或false .fi
可观察的:foo
和bar
foo
将返回对象的数组
,[{id:1},{id:2},…]
(它将返回整个数组(使用AngularFire.list
此处))
bar
对从foo
返回的每个项目都有一个存储值。该值存储为对象:{id:2,status:false}
这里需要做的是首先调用foo
,在它的map函数中,如果bar
响应中的匹配值为false,我想从subscribe()
方法中取出{id:2}
换句话说
从foo
.map
对象,并从栏检查每个对象的状态
bar
返回值为true
或false
.filter
foo
以取出状态为false
我尝试了combinelatetest
、zip
和其他RxJS
方法,但不确定是否正确。有没有人能告诉我正确的方法,或者至少指出我应该探索的方法
谢谢你的帮助
谢谢
//
订阅foo
后,它返回的数组必须经过过滤
才能仅返回itemId1
,因为它的bar
值是true
(两者都是可见的,foo和bar of c)下面是一段完成任务的代码:
foo = Rx.Observable.of([
{id: 1, data: 'foo1'},
{id: 2, data: 'foo2'},
{id: 3, data: 'foo3'},
{id: 4, data: 'foo4'},
{id: 5, data: 'foo5'},
{id: 6, data: 'foo6'}
]);
bar = Rx.Observable.of([
{id: 1, status: false},
{id: 2, status: true},
{id: 3, status: true},
{id: 4, status: false},
{id: 5, status: true},
{id: 6, status: false}
]).flatMap(obj => obj);
Rx.Observable.combineLatest(foo, bar)
.filter(([foo, bar]) => bar.status)
.map(([foo, bar]) => foo.find(obj => obj.id === bar.id))
.subscribe(data => {
console.log(data)
});
foo
是一个接一个地发射值还是一次发射整个数组?如果你能表现出你想要重现的行为,那就太好了。我猜,zip或CombineTest应该都能工作。Hi@BorisLobanovfoo
发射整个数组。bar
是否也发射布尔数组?事实上,很抱歉,bar
将根据foo
中的单个id
发射一个对象。因此,它们需要映射在一起,对于foo
中数组中的每个id,从bar
中的相关对象获取最新值。希望我没有把这件事复杂化。你能看看我制作的JSFIDLE,看看它是否在做你需要的事情吗?问题,请检查:现在它返回未定义的
,因为我添加了一个不存在的密钥。什么是好的解决方法?如果你能帮忙,我将不胜感激。谢谢
foo = Rx.Observable.of([
{id: 1, data: 'foo1'},
{id: 2, data: 'foo2'},
{id: 3, data: 'foo3'},
{id: 4, data: 'foo4'},
{id: 5, data: 'foo5'},
{id: 6, data: 'foo6'}
]);
bar = Rx.Observable.of([
{id: 1, status: false},
{id: 2, status: true},
{id: 3, status: true},
{id: 4, status: false},
{id: 5, status: true},
{id: 6, status: false}
]).flatMap(obj => obj);
Rx.Observable.combineLatest(foo, bar)
.filter(([foo, bar]) => bar.status)
.map(([foo, bar]) => foo.find(obj => obj.id === bar.id))
.subscribe(data => {
console.log(data)
});