首页 > 解决方案 > 角度可观察订阅中的计算提供了错误的数据

问题描述

我有一个 observable,它以以下结构提供数据:

export interface expResults {
  user: User;
  results: {
    experiment: Experiment
    attempts: number
    passed: boolean
  }[];
}

我现在要做的是计算至少进行一次实验的速率。例如:

  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
  }[];

在这种情况下,我希望输出“0,5”,因为 50% 的用户至少尝试了一次实验。

我使用以下代码,但它不返回任何数据。有人可以看到我的错误吗?

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();
}

标签: angularrxjsobservablerxjs-observables

解决方案


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

推荐阅读