[英]Calculation in angular observable subscription delivers wrong data
I have a observable which delivers data in the following structure:我有一个 observable,它以以下结构提供数据:
export interface expResults {
user: User;
results: {
experiment: Experiment
attempts: number
passed: boolean
}[];
}
What I want to do now is to calculate the rate of experiments performed at least once.我现在要做的是计算至少执行一次的实验率。 For example:
例如:
Donald;
results: {
experiment: Experiment1
attempts: 3
passed: true
}[];
Micky;
results: {
experiment: Experiment1
attempts: 0
passed: false
}[];
Frank;
results: {
experiment: Experiment1
attempts: 3
passed: false
}[];
Lisa;
results: {
experiment: Experiment1
attempts: 0
passed: false
}[];
In this case I expect the output "0,5" because 50% of the users tried the experiment at least once.在这种情况下,我期望输出“0,5”,因为 50% 的用户至少尝试了一次实验。
I use the following code but it returns no data.我使用以下代码,但它不返回任何数据。 Can someone see my mistake?
有人可以看到我的错误吗?
expResults: Observable<expResults[]> = of();
ngOnInit(): void {
this.expResults = this.dataService.getData(topic);
this.expResults.pipe(map((resultSet2) => {
return resultSet2.reduce((acc, resultSet) => {
resultSet.results.forEach((t) => {
if (acc[t.attempts] == null) acc[t.attempts] = [];
else {
if (t.attempts == 0) {
acc[t.attempts].push(0);
} else {
acc[t.attempts].push(1);
}
}});
return acc;
}, {});
}),
map((resultsObj) => {
return Object.keys(resultsObj).map((key) => {
const count = resultsObj[key].length;
const sum = resultsObj[key].reduce((a, b) => a + b, 0);
const rate = sum / count;
this.ChartData[0].data.push(Number(rate));
});
})
)
.subscribe();
}
this.expResults.pipe(map((result: expResults[]) => {
// Calculate number of experiments performed at least once
const numberOfPerformed = result.reduce((acc, item) => {
// If attempts > 0 then add 1 to the sum
acc += (item.results.attempts ? 1 : 0);
return acc;
}, 0)
// Calculate rate
return numberOfPerformed / result.length;
})).subscribe((rate) => {
// rate
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.