Получить соответствующий интервал - PullRequest
0 голосов
/ 16 сентября 2018

Итак, я начинаю с двух простых вещей :

  • Список временных интервалов с соответствующим ему именем интервала.
  • И currentTime , например, например ("08:58", "15:23", "02:03").

let intervals = {
    "08:00 - 09:00" : "Morning yoga",
    "09:00 - 10:00" : "Breakfast",
    "10:00 - 13:00" : "School Period",
    "13:00 - 14:00" : "Basketball",
    "14:00 - 16:00" : "Free Period",
    "16:00 - 17:00" : "Evening Meal",
    "17:00 - 18:00" : "Exercise Period",
    "18:00 - 19:00" : "Shower Block",
    "19:00 - 22:00" : "Evening Free Time",
    "22:00 - 23:00" : "Evening Rollcall",
    "23:00 - 08:00" : "Lights Out"
  }

Я хотел бы извлечь интервал имя для данного currentTime , так что я получаю, например, от:

  • "08:58" результат: "Morning yoga"
  • "15:23"результат: "Free Period"
  • "02:03" результат: "Lights Out"

Пока я получил код ниже, но, очевидно, внутри есть некоторые ошибки.

let getSchedule = function(time) {
  let scheduleIndex = 0;
  let current = getMinute(time);
  let intervalArray = []

  for (let key in schedule)
    intervalArray.push([getMinute(key.split(" - ")[0]),
      getMinute(key.split(" - ")[1])
    ]);

  for (let index = 0; index < intervalArray.length; index++) {
    let interval = intervalArray[index]
    if (current >= interval[0] && current < interval[1]) {
      scheduleIndex = index;
      break;
    }
  };
  return schedule[Object.keys(schedule)[scheduleIndex]]
}

let getMinute = function(time) {
  let hour = parseInt(time.split(":")[0]),
    minute = parseInt(time.split(":")[1]);
  return minute + hour * 60;
}

let result = getSchedule("16:22")
console.log(result)

result = getSchedule("02:00")
console.log(result)
<script>
  let schedule = {
    "08:00 - 09:00": "Morning yoga",
    "09:00 - 10:00": "Breakfast",
    "10:00 - 13:00": "School Period",
    "13:00 - 14:00": "Basketball",
    "14:00 - 16:00": "Free Period",
    "16:00 - 17:00": "Evening Meal",
    "17:00 - 18:00": "Exercise Period",
    "18:00 - 19:00": "Shower Block",
    "19:00 - 22:00": "Evening Free Time",
    "22:00 - 23:00": "Evening Rollcall",
    "23:00 - 08:00": "Lights Out"
  }
</script>

Редактировать : обратите внимание, что полные часы изменят состояние так, что 23: 00 будет иметь состояние Lights Out, в то время как 22: 59 имеет состояние Evening Rollcall.

Обратите внимание, что я не могу изменить объект intervals.Это структура должна быть сохранена.

Ответы [ 4 ]

0 голосов
/ 16 сентября 2018

Я перекрасил твой код a bit.Это сделано более функционально и я считаю читабельным.Также я принял во внимание некоторые крайние случаи (не все, конечно, потому что это не тот случай, я верю).Взгляните на этого плохого парня:

// Keep in mind that for e.g. `14:00` you have two parameters that fullfil the requirement: 
// `Basketball` and `Free Period`. 
// This constrain should be specified in the code somewhere.
// Otherwise the first value will be taken.
let schedule = {
    "08:00 - 09:00" : "Morning yoga",
    "09:00 - 10:00" : "Breakfast",
    "10:00 - 13:00" : "School Period",
    "13:00 - 14:00" : "Basketball",
    "14:00 - 16:00" : "Free Period",
    "16:00 - 17:00" : "Evening Meal",
    "17:00 - 18:00" : "Exercise Period",
    "18:00 - 19:00" : "Shower Block",
    "19:00 - 22:00" : "Evening Free Time",
    "22:00 - 23:00" : "Evening Rollcall",
    "23:00 - 08:00" : "Lights Out"
  }


let newSchedule = Object
  .entries(schedule)
  .reduce((acc, entry) => {
    const newInterval = {
      from: Number(entry[0].slice(0,5).replace(':','')),
      to: Number(entry[0].slice(-5).replace(':','')),
      value: entry[1],
    };
    return [...acc, newInterval];
  }, [])
  .reduce((acc, { from, to, value}) => {
    // this step is only needed when you can't set ranges in `schedule` object manually
    let intervals = [{ from, to, value }];
    if(from > to) {
      intervals = [
        { 
          from, 
          to: 2400,
          value,
        },
        { 
          from: 0, 
          to,
          value,
        },
      ];
    }
    return [...acc, ...intervals];
  }, []);

const getSchedule = (time) => {
  const timeAsNumber = Number(time.replace(':', ''));
  return newSchedule.find(interval => {
    return timeAsNumber >= interval.from && timeAsNumber <= interval.to;
  }).value
}

console.log(getSchedule('02:00'))
console.log(getSchedule('18:00'))

Я призываю вас провести его дальнейшую реорганизацию, например, в более функциональный подход, более производительный или просто более чистый.

0 голосов
/ 16 сентября 2018

Если вы измените структуру данных, это станет намного проще.

const schedule = {
  "Morning yoga": [800, 900],
  "Breakfast": [900, 1000]
};

const getSchedule = timeString => {
  const time = +timeString.replace(":", "");
  const result = [];
  for (const key in schedule) {
    if (time >= schedule[key][0] && time <= schedule[key][1]) {
      result.push(key);
    }
  }
  return result;
};

const result = getSchedule("09:22");
console.log(result);
0 голосов
/ 16 сентября 2018

Я сделал это немного по-другому. Может быть полезно для вас.

let schedule = {
  "08:00 - 09:00": "Morning yoga",
  "09:00 - 10:00": "Breakfast",
  "10:00 - 13:00": "School Period",
  "13:00 - 14:00": "Basketball",
  "14:00 - 16:00": "Free Period",
  "16:00 - 17:00": "Evening Meal",
  "17:00 - 18:00": "Exercise Period",
  "18:00 - 19:00": "Shower Block",
  "19:00 - 22:00": "Evening Free Time",
  "22:00 - 23:00": "Evening Rollcall",
  "23:00 - 08:00": "Lights Out"
}
var getSchedule = function(time) {
let fullDaySchedule = {}
  Object.entries(schedule).forEach(([currentTime, work]) => {
    let startTime = +currentTime.split(" - ")[0].split(":")[0],
      endTime = +currentTime.split(" - ")[1].split(":")[0];

    (startTime > endTime) && (endTime = (23 - startTime) + (23 + endTime))

    for (let index = startTime; index <= endTime; index++) {
      fullDaySchedule[(index % 24)] = work;
    }
  })

  console.log(fullDaySchedule[+time.split(":")[0]])
}

// You can test this
getSchedule("02:00")
0 голосов
/ 16 сентября 2018

Сценарий изначально устанавливает scheduleIndex на 0 (значение по умолчанию) и никогда не проверяет, найден ли соответствующий интервал

Ваша логика никогда не будет соответствовать интервалу "Lights Out", потому что конечное значение меньше, чем начальное значение, и ваша логика не допускает этого.

getSchedule поэтому возвращает элемент «по умолчанию» из schedule, «Утренняя йога» вместо «Lights Out».

Возможные решения:

  1. Измените свою логику, чтобы она соответствовала интервалу "Lights Out".
  2. Разделите ваш интервал «Lights Out» на два: «00:00 - 08:00» и «23:00 - 23:59» и сохраните текущую логику
  3. Сохраните логику и добавьте проверку ошибок (установите scheduleIndex в недопустимое значение и проверьте это перед возвратом результата), удалите интервал «Отключение» из расписания и предположите, что все, что не соответствует, является этим интервалом по умолчанию. (Показано ниже)

let getSchedule = function(time) {
  let scheduleIndex = -1;
  let current = getMinute(time);
  let intervalArray = []

  for (let key in schedule)
    intervalArray.push([getMinute(key.split(" - ")[0]),
      getMinute(key.split(" - ")[1])
    ]);

  for (let index = 0; index < intervalArray.length; index++) {
    let interval = intervalArray[index]
    if (current >= interval[0] && current < interval[1]) {
      scheduleIndex = index;
      break;
    }
  };
  return -1 == scheduleIndex? "Lights Out" : schedule[Object.keys(schedule)[scheduleIndex]];
}

let getMinute = function(time) {
  let hour = parseInt(time.split(":")[0]),
    minute = parseInt(time.split(":")[1]);
  return minute + hour * 60;
}

let result = getSchedule("16:22")
console.log(result)

result = getSchedule("02:00")
console.log(result)
<script>
  let schedule = {
    "08:00 - 09:00": "Morning yoga",
    "09:00 - 10:00": "Breakfast",
    "10:00 - 13:00": "School Period",
    "13:00 - 14:00": "Basketball",
    "14:00 - 16:00": "Free Period",
    "16:00 - 17:00": "Evening Meal",
    "17:00 - 18:00": "Exercise Period",
    "18:00 - 19:00": "Shower Block",
    "19:00 - 22:00": "Evening Free Time",
    "22:00 - 23:00": "Evening Rollcall",
  }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...