如何使用angular和firebase从json值获取平均值

时间:2019-01-25 09:41:25

标签: json angular firebase

首先,我是法国人,所以我为我的英语道歉...

我想使用firebase和angular从json中的值计算平均值。我的目标是使用特定的ID进行过滤并获取费率值。

"avis" : {
"-LTMQXqMDrRPgJmtYteU" : {
  "date" : "11/11/2018",
  "description" : "jkldjflsdjfklsdjklfjkdkl",
  "id" : "-LPzmMTwf8muvAl8xhPM",
  "name" : "daniel",
  "rate" : "4"
},
"-LTM_fI6KREHqKkdcjc1" : {
  "date" : "12/12/2018",
  "description" : "jlkj",
  "id" : "-LPzmr9M6DrSCViNphj-",
  "name" : "sfgf",
  "rate" : 2
},
"-LWQJuqDJoogUcZt5KPL" : {
  "date" : "17/01/2019",
  "description" : "FFFF",
  "id" : "-LPzmr9M6DrSCViNphj-",
  "name" : "FFF",
  "rate" : 1
},

... 例如,在下面,我想计算id -LPzmr9M6DrSCViNphj-的平均速率。这样我得到的比率为2和1,平均为1.5。

我创建了一个函数:

    this.afDb.list('/avis', ref => ref.orderByChild('id').equalTo(this.item.key)).valueChanges().
subscribe(
  result => {
    console.log('result: ', result);
  });

但是当我这样做时,我拥有所有值,并且我只希望对值进行评分...

我不清楚是否清楚...

非常感谢您的支持!

3 个答案:

答案 0 :(得分:0)

const total = avis.reduce((sum, item) => sum + item.rate, 0);

console.log(total);

OR

this.http.get('/avis')
.map(response.avis)
.map(res => res.rate)
.reduce((a, b) => a + b)
.subscribe(res => console.log(res))

答案 1 :(得分:0)

您可以使用.map()reduce()来获得平均值。

let listData = this.afDb.list('/avis', {
            query: {
                orderByChild: 'id',
                equalTo: this.item.key,
            }
        }).valueChanges();

let avg = listData.map(res => res["rate"]).reduce((a, b) => a + b)/listData.length;

或者使用与下面的代码相同的代码来求平均值。

this.afDb.list('/avis', ref => ref.orderByChild('id').equalTo(this.item.key)).valueChanges().
subscribe(
  result => {

    console.log('result: ', result);
    let avg = result.map(res => res. rate).reduce((a, b) => a + b)/result.length;

  });

通过.map().reduce(),您将获得总评分,然后将其除以数组length

引用链接:https://www.jstips.co/en/javascript/array-average-and-median/

希望这会有所帮助!

答案 2 :(得分:0)

@CodeChanger:

this.listData = this.afDb.list('avis', ref => ref.orderByChild('id').equalTo(this.item.key)).valueChanges();
this.avg = this.listData.map(res => res.rate).reduce((a, b) => a + b) / this.listData.length;

编译后没有任何错误,但是当我启动我的应用程序时,出现此错误:

错误错误:未捕获(承诺):TypeError:this.listData.map不是函数