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'))
}