#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