首先,我是法国人,所以我为我的英语道歉...
我想使用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);
});
但是当我这样做时,我拥有所有值,并且我只希望对值进行评分...
我不清楚是否清楚...
非常感谢您的支持!
答案 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不是函数