Считывание возвращаемых значений в формате json и усреднение значения поля с помощью count с помощью javascript

#javascript #arrays #json

#javascript #массивы #json

Вопрос:

Мое возвращаемое значение из вызова api выглядит следующим образом

  var array = {"scores":[
      { userid: "1", mark: 4.3 },
      { userid: "1", mark: 3.8 },
      { userid: "2", mark: 4.6 },
      { userid: "2", mark: 4.1 },
      { userid: "2", mark: 3.9 },
      { userid: "2", mark: null}
    ]};
  

Ожидаемый результат должен соответствовать идентификатору пользователя со средним значением отметки и общего количества. мы не должны учитывать, является ли значение mark равным null

 var arr = [
  { userid: "1", mark: 4.05, count: 2 },
  { userid: "2", mark: 4.2, count: 3}
]
  

я пробовал использовать приведенный ниже скрипт, но он выдает ошибку — array.scores[0].reduce — это не функция

  result = Array.from(
            array.scores[0].reduce((m, { userid, mark}) => {
                var temp = m.get(userid) || { sum: 0, count: 0 };
                temp.sum  = mark;
                temp.count  ;
                return m.set(userid, temp);
            }, new Map),
            ([externalCourse, { sum, count }]) => ({ userid, average: sum / count, count })
        );
console.log(result);
  

Комментарии:

1. поскольку array.scores[0] — это объект в массиве, а не массив.

Ответ №1:

Используя Array.prototype.reduce , вы можете сгруппировать входные данные по userid и на основе этой сгруппированной информации об объекте, вы можете вычислить среднее значение оценок следующим образом.

 const input = {
  "scores": [{
      userid: "1",
      mark: 4.3
    },
    {
      userid: "1",
      mark: 3.8
    },
    {
      userid: "2",
      mark: 4.6
    },
    {
      userid: "2",
      mark: 4.1
    },
    {
      userid: "2",
      mark: 3.9
    }
  ]
};

const groupBy = input.scores.reduce((acc, cur) => {
  acc[cur.userid] ? acc[cur.userid].mark.push(cur.mark) : acc[cur.userid] = {
    userid: cur.userid,
    mark: [ cur.mark ]
  };
  return acc;
}, {});
const output = Object.values(groupBy).map((item) => ({
  userid: item.userid,
  count: item.mark.length,
  mark: item.mark.reduce((acc, cur) => acc   cur, 0) / item.mark.length
}));
console.log(output);  

Комментарии:

1. Спасибо за поддержку. в дополнение к этому, я хочу избежать индекса, который помечен как null