Как я могу получить среднее значение JSON с использованием угловых и FireBase - PullRequest
0 голосов
/ 25 января 2019

Прежде всего, я француз, поэтому я приношу свои извинения за мой английский ...

Я бы хотел вычислить среднее значение из значений в json, используя firebase и angular.Моя цель - отфильтровать по определенному идентификатору и получить значение ставки.

"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 голосов
/ 25 января 2019

Вы можете использовать .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/

Надеюсь, это поможет!

0 голосов
/ 25 января 2019

@ 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;

После компиляции ошибки нет, но когда я запускаю свое приложение, у меня появляется эта ошибка:

Ошибка: ошибка (в обещании): Ошибка типа: this.listData.map не является функцией

0 голосов
/ 25 января 2019
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...