Данные JSON для расчета общей посещаемости в процентах?

У меня есть данные о посещаемости для конкретного студента. Если он присутствовал то отметил 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. Пожалуйста, помогите мне.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Формат довольно ужасный, но вы все равно можете перебирать объекты с синтаксисом 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}%` );

Спасибо за помощь, но он показывает что-то вроде "00[object Object]true[object Object]false00[object Object][object Object][object Object][object Object]"

Jaydeep Chouhan 19.04.2023 10:55

Ты понял это, не так ли?

KooiInc 19.04.2023 12:43
Ответ принят как подходящий

Вы можете сделать это с комбинацией 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[объект Объект][объект Объект][объект Объект][объект Объект]"

Jaydeep Chouhan 19.04.2023 10:52

Не могли бы вы предоставить мне свой входной объект

bill.gates 19.04.2023 10:54

Да в этом проблема

Jaydeep Chouhan 19.04.2023 11:51

Я получаю его из mongodb, а затем просто добавляю строку ниже, т.е. const student = (studentss).toJSON(), и теперь все работает нормально.

Jaydeep Chouhan 19.04.2023 11:53

Другие вопросы по теме