Angular 可观察的查找嵌套属性

Angular 可观察的查找嵌套属性,angular,rxjs,observable,Angular,Rxjs,Observable,这个物体的可观测返回 [ { "args": { }, "output": [ { "id": "1", "name": "Jack", "lastName": "Sparrow", }, { "id": "2", "name": "Davy ", "lastName": "Jones", } ], } ] 有没有一种方

这个物体的可观测返回

[
  {
    "args": { },
    "output": [
      {
        "id": "1",
        "name": "Jack",
        "lastName": "Sparrow",
      },
      {
        "id": "2",
        "name": "Davy ",
        "lastName": "Jones",
      }
    ],
  }
]
有没有一种方法可以使用
RxJx
运算符返回
output
数组的元素,其中
id==2
?因此,只有这样:

{
  "id": "2",
  "name": "Davy ",
  "lastName": "Jones",
}
我想我应该使用
find
,尽管找不到嵌套对象的使用示例

我当前的代码(我知道
find
part不正确):

public getUserData(id:number){
this.http.get(URL)
.烟斗(
查找(元素=>element.output)
)
.订阅(res=>{
console.log(res)
})
}
您可以使用过滤器:

public getUserData(id: number) {
  this.http.get<any>(URL)
  .pipe(
     filter(element => {
       for (let output of element.output){
           return output.id === "2";
       }
     })
  )
  .subscribe(res => {
   console.log(res)
  })
}
public getUserData(id:number){
this.http.get(URL)
.烟斗(
过滤器(元件=>{
for(让元素的输出。输出){
返回output.id==“2”;
}
})
)
.订阅(res=>{
console.log(res)
})
}

只需结合使用
mergeMap
(在其他Rx实现中通常称为
flatMap
)和
过滤器

mergeMap
允许您:

  • 将每个项目映射到列表中(即,为每个事件发出一个值列表)
  • 将列表展平返回到一个事件流中
  • 。。。然后对其进行
    筛选
    ,以便只保留与您选择的谓词匹配的谓词(在您的示例中:
    output=>output.id==2


    您可以使用下面的代码片段,在这里您可以编辑自己收到的响应,并单击相应的按钮来触发事件

    const数据=[{
    “args”:{},
    “产出”:[{
    “id”:“1”,
    “姓名”:“杰克”,
    “姓氏”:“麻雀”,
    },
    {
    “id”:“2”,
    “姓名”:“戴维”,
    “姓氏”:“琼斯”,
    }
    ],
    }];
    const textarea=document.querySelector(“#数据源”);
    const button=document.querySelector(“#触发器响应”);
    //假设“myObservable”来自Ajax请求的结果`
    常数myObservable=rxjs
    .fromEvent(按钮“单击”)
    .pipe(rxjs.operators.map(()=>JSON.parse(textarea.value.replace(/,(?=\s*\})/mg.));
    myObservable.pipe(
    rxjs.operators.mergeMap(response=>response[0].output),
    rxjs.operators.filter(output=>output.id=='2')
    ).subscribe(x=>console.log(x))
    
    正文{
    显示器:flex;
    对齐项目:居中;
    }
    文本区{
    柔性生长:1;
    }
    
    [
    {
    “args”:{},
    “产出”:[
    {
    “id”:“1”,
    “姓名”:“杰克”,
    “姓氏”:“麻雀”,
    },
    {
    “id”:“2”,
    “姓名”:“戴维”,
    “姓氏”:“琼斯”,
    }
    ],
    }
    ]
    单击我
    我会这样做:

    this.http.get(URL)
    .烟斗(
    mergeAll(),//展平根数组
    mergeMap(item=>item.output),//展平输出数组
    过滤器(output=>output.id=='2')
    )
    .订阅(res=>{
    console.log(res);//Tahdah!!
    })
    
    如果您不关心可观察物的发射(例如发射频率),您可以使用
    过滤器
    从可观察物中,而从可观察物中。从根本上说,它们是不同的,但除非你有任何强有力的理由使用可观察的一个,你可以只使用阵列一个。代码更短,性能更高:

    public getUserData(id: number) {
        this.http.get<any>(URL)
            .map(data => data.output.filter(x => x.id === '2'))
    }
    

    但是,不是发现与过滤器相同,但在第一次之后中断吗?
    public getUserData(id: number) {
        this.http.get<any>(URL)
            .map(data => data.output.filter(x => x.id === '2'))
    }
    
    public getUserData(id: number) {
        this.http.get<any>(URL)
            .map(data => data.output.find(x => x.id === '2'))
    }