我正在订阅一个observable,并使用a属性(结果中的一个数组)进行调用并修改该数组中的每个项目并返回最终结果或输出。
下面是我当前无法使用的代码。我不确定自己在做什么错。 为了使此代码正常工作,我应该进行哪些更改?
$..data[?(@.key==266)]
此代码似乎有效,但效率不高。我提供它是为了通过代码更好地阐明我的目标。
{"data": {
"Aatrox": {
"version": "8.19.1",
"id": "Aatrox",
"key": "266",
"name": "Aatrox",
"title": "the Darkin Blade"
},
"Ahri": {
"version": "8.19.1",
"id": "Ahri",
"key": "103",
"name": "Ahri",
"title": "the Nine-Tailed Fox"
}
}
}
答案 0 :(得分:0)
我不确定我是否有想要做的事情,但是我想你想要这样的事情:
this.esService.search(JSON.stringify(query)).pipe(
tap((response) => this.esResponse = response),
switchMap((response) => {
const arrayOfObservables: any[] = response.hits.hits.map((item) =>
this.productService.getProductById(this.schemaId,
item['_source']['consensusAssessmentId']).pipe(tap((resp) => {
const answers = resp['answers'];
const meets_count = answers.reduce((acc, cur) => cur.value === "Meets" ? ++acc : acc, 0);
const needs_count = answers.reduce((acc, cur) => cur.value === "Needs Improvement" ? ++acc : acc, 0);
item['_source']['meets'] = meets_count.toString();
item['_source']['needs'] = needs_count.toString();
}))
);
return forkJoin(arrayOfObservables);
})).subscribe((resp) => this.rows = resp.map(
this.esService.convertToPE));
答案 1 :(得分:0)
您似乎对可观察性的工作原理有所了解,但让我们通过简化方法来改变解决问题的方式。首先,我们不是使用嵌套/链接多个subscribe()
方法,而是使用pipeable operators。
然后,我们使用RxJS的mergeMap运算符将search()
的可观察值映射到内部getProductById()
将使用的可观察值。
在mergeMap()
块中,我们需要遍历由常量变量result
表示的数组。我们遍历result
数组中的每个元素,然后将每个可观察到的元素从getProductById()
推入observablesList
。然后,我们使用forkJoin()运算符,该运算符等待迭代完成,然后返回所有可观察值。
不要忘记将所需的运算符导入您的类/组件中。
import { forkJoin } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
this.esService.search(JSON.stringify(query)).pipe(
mergeMap(response => {
this.esResponse = response;
const result = this.esResponse.hits.hits;
const observablesList = [];
observablesList = result.map(obj => {
const id = obj['_source']['consensusAssessmentId'];
return this.productService.getProductById(this.schemaId, id);
});
return forkJoin(observablesList);
})
).subscribe(resp => {
console.log(resp);
// handle the rest here
const answers = resp['answers'];
const meets_count = answers.reduce((acc, cur) => cur.value === "Meets" ? ++acc : acc, 0);
const needs_count = answers.reduce((acc, cur) => cur.value === "Needs Improvement" ? ++acc : acc, 0);
item['_source']['meets'] = meets_count.toString();
item['_source']['needs'] = needs_count.toString();
// more things
})
});