Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS正在等待嵌套的observable来过滤数组数据_Javascript_Firebase_Rxjs_Angularfire2_Reactivex - Fatal编程技术网

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@BorisLobanov
    foo
    发射整个数组。
    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)
      });