Рассчитать общую продолжительность для свойств в объекте - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующий объект в массиве [0]:

var arr[0]=
[
 {
   "startTime": "1300",
    "endTime": "1700",
    "eventName": "Sleep",
     "end_datetime": "20180510M0100", 
     "start_datetime": "20180509M2300", 
 },
 {
    "startTime": "0800",
    "endTime": "1200", 
    "eventName": "Breakfast",
     "end_datetime": "20180507M1200", 
     "start_datetime": "20180507M0800", 
 },
 {
   "startTime": "1300",
    "endTime": "1400",
    "eventName": "Lesson",
    "end_datetime": "20180507M1400", 
     "start_datetime": "20180507M1300", 
 },
 {
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Ski",
    "end_datetime": "20180511M170000", 
    "start_datetime": "20180511M130000",
 } 
]

end_datatime имеет формат yyyymmddMhhmmss (первые 4 цифры - это год, затем месяцы, дни, разделитель «M», часы, минуты и секунды.

Я хотел бы рассчитать общую продолжительность всех событий? (Всего 11 часов, что составляет 2 часа во сне + 4 часа на завтраке + 1 час на уроке + 4 часа на лыжах)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вот одна из возможных реализаций с учетом времени, охватывающего несколько дней:

const input = [{
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Sleep",
    "end_datetime": "20180510M0100",
    "start_datetime": "20180509M2300",
  },
  {
    "startTime": "0800",
    "endTime": "1200",
    "eventName": "Breakfast",
    "end_datetime": "20180507M1200",
    "start_datetime": "20180507M0800",
  },
  {
    "startTime": "1300",
    "endTime": "1400",
    "eventName": "Lesson",
    "end_datetime": "20180507M1400",
    "start_datetime": "20180507M1300",
  },
  {
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Ski",
    "end_datetime": "20180511M170000",
    "start_datetime": "20180511M130000",
  }
];

function getDiff(datestr1, datestr2) {
  const m1 = moment(datestr1, 'YYYYMMDD*hhmm');
  const m2 = moment(datestr2, 'YYYYMMDD*hhmm');
  const minuteDifference = m2.diff(m1, 'minutes');
  return minuteDifference;
}
const totalMinutes = input.reduce(
  (accum, {
    end_datetime,
    start_datetime
  }) => accum + getDiff(start_datetime, end_datetime),
  0
);
const totalHours = totalMinutes / 60;
console.log(totalMinutes + ' minutes = ' + totalHours + ' hours');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
0 голосов
/ 08 мая 2018

Вам нужен аккумулятор, чтобы отслеживать время до сих пор. Я предполагаю, что цифры относятся к минутам или что-то. Если это действительно время (как в 1700 = 5 вечера), то вам, очевидно, нужно сделать больше логики (потому что событие может начинаться в 1159 и заканчиваться в 01:00, и в таком случае startTime - endTime не будет работать), но с вашей попытки кажется, что вы просто ищете разницу между двумя числами. Вот что я получил:

arr = [
{
   "startTime": "1300",
    "endTime": "1700",
    "eventName": "Tea" 
 },
 {
    "startTime": "0800",
    "endTime": "1200", 
    "eventName": "Breakfast" 
 },
 {
   "startTime": "1300",
    "endTime": "1400",
    "eventName": "Lesson" 
 },
 {
    "startTime": "1300",
    "endTime": "1700",
    "eventName": "Ski"
 } 
]

arr.reduce((acc, val) => {
  return acc + (parseInt(val.endTime) - parseInt(val.startTime))
}, 0)

// returns 1300
...