简体   繁体   English

angular observable 订阅中的计算提供了错误的数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM