У меня есть данные о посещаемости для конкретного студента. Если он присутствовал то отметил 1 иначе отметил 0 в уважаемой теме. Как я могу рассчитать общую посещаемость из этого. Пожалуйста, помогите мне...
{
"CGMM": {
"17:4:2023": 1,
"19:4:2023": 0
},
"CNS": {
"17:4:2023": 1
},
"ML": {
"17:4:2023": 1,
"16:4:2023": 1
}
}
Мне нужно, чтобы я мог посчитать все те пары ключ-значение, значение которых равно 1, а затем разделить его на общее количество. пар ключ-значение существуют, которые я нахожу:
const attendenceInML = Object.keys(student.ML).length;
const attendenceInSEA = Object.keys(student.SEA).length;
const attendenceInCGMM = Object.keys(student.CGMM).length;
const attendenceInCNS = Object.keys(student.CNS).length;
const total = attendenceInML+ attendenceInSEA+ attendenceInCGMM+ attendenceInCNS;
а затем умножьте результат на 100, чтобы получить общую посещаемость в процентах, но я не знаю, как получить только те пары ключ-значение, значение которых равно 1. Пожалуйста, помогите мне.
Формат довольно ужасный, но вы все равно можете перебирать объекты с синтаксисом for in
:
const data = JSON.parse(input);
let totalClasses = 0;
let attendedClasses = 0;
for (const subject in data) {
if (data.hasOwnProperty(subject)) { //So that we don't get a runtime error if the object is empty
const dates = data[subject];
for (const date in dates) {
if (dates.hasOwnProperty(date)) {
totalClasses++;
attendedClasses += dates[date];
}
}
}
}
const attendancePercentage = (attendedClasses / totalClasses) * 100;
Вы можете уменьшить данные и вычислить сумму/среднее с их помощью. Что-то вроде:
const data = {
"CGMM": {
"17:4:2023": 1,
"19:4:2023": 0
},
"CNS": {
"17:4:2023": 1
},
"ML": {
"17:4:2023": 1,
"16:4:2023": 1
}
};
const totalAttendance = Object.values(data)
.reduce( (acc, v) => acc.concat(Object.values(v)), [] );
const sum = totalAttendance.reduce( (acc, v) => acc + v, 0 );
const attendance = sum / totalAttendance.length * 100;
console.info( `sum of value 1: ${sum}\nattendance percentage: ${
attendance}%` );
Ты понял это, не так ли?
Вы можете сделать это с комбинацией Object.entries
, Object.values
и .reduce
let student = {
"CGMM": {
"17:4:2023": 1,
"19:4:2023": 0
},
"CNS": {
"17:4:2023": 1
},
"ML": {
"17:4:2023": 1,
"16:4:2023": 1
}
}
let result = Object.entries(student)
.reduce((prev, [key, objValue]) => prev + Object.values(objValue)
.reduce((prev,curr) => prev + curr,0),0)
console.info(result)
Не знаю почему, но он печатается так: "00[объект Объект]true[объект Объект]false00[объект Объект][объект Объект][объект Объект][объект Объект]"
Не могли бы вы предоставить мне свой входной объект
Да в этом проблема
Я получаю его из mongodb, а затем просто добавляю строку ниже, т.е. const student = (studentss).toJSON(), и теперь все работает нормально.
Спасибо за помощь, но он показывает что-то вроде "00[object Object]true[object Object]false00[object Object][object Object][object Object][object Object]"