Условное утверждение - определение сезона

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

  • месяц как строка
  • дата как число

Дата начала сезона Весна 20 марта, Лето 21 июня, Осень 22 сентября, Зима 21 декабря

Любая помощь приветствуется!

let month = 'Dec';
let day = 23;

if(month === 'Apr' || month === 'May') {
    console.log('Spring');
    } else if((day >= 20 && month === 'Mar') || (day < 21 && month === 'Jun')) {
        console.log('Spring');
    } else if(month === 'Jul' || month === 'Aug') {
        console.log("Summer");
    } else if((day >= 21 && month === 'Jun') || (day < 22 && month === 'Sept')){      
        console.log("Summer");
    } else if (month === 'Oct' || month === 'Nov') {
        console.log("Autumn");
    } else if ((day >= 22 && month === 'Sept') || (day < 21 && month === 'Dec')) {
        console.log("Autumn");
    } else if (month === 'Oct' || month === 'Nov') {
        console.log("Winter");
    } else if((day >= 21 && month === 'Dec') || (day < 20 && month === 'Mar')){
        console.log("Winter");
    }


person Georgi Popov    schedule 25.09.2020    source источник
comment
Отвечает ли это на ваш вопрос? Кодирование Javascript: введите конкретную дату, выведите сезон   -  person Christian Baumann    schedule 25.09.2020
comment
Я прошел через это, и из того, что я мог видеть, принятое решение, а также некоторые остальные, не включают информацию о том, как реализовать ввод числа в решении. Я видел, что есть более сложные решения, но они кажутся совершенно отличными от того, чего я пытаюсь достичь :)   -  person Georgi Popov    schedule 25.09.2020
comment
@GeorgiPopov Как выбирается месяц? Упражнение просто предоставляет вам месяц в виде строки или будет раскрывающийся список, из которого вы можете выбрать месяц?   -  person nick zoum    schedule 25.09.2020
comment
Извините, я должен был предоставить эту информацию изначально. Просто строковая форма.   -  person Georgi Popov    schedule 25.09.2020
comment
ОК. Я обновил свой код, предполагая, что месяц представляет собой трехсимвольную строку, а день — число. Я просто создаю строку в формате MMDD и выполняю тесты, как раньше.   -  person ATD    schedule 25.09.2020


Ответы (3)


Если вы можете преобразовать свою дату в строку в формате MMDD, вы можете сделать:

var months = ["xxx","Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

function getMMDD(mth, dy) {
  return months.indexOf(mth).toString().padStart(2, "0") + dy.toString().padStart(2, "0");
}  

function findSeason(mth, dy) {
  let d = getMMDD(mth, dy);
  if (d < "0320") {return "Winter";}
  if (d < "0621") {return "Spring";}
  if (d < "0921") {return "Summer";}
  if (d < "1222") {return "Autumn";}
  return "Winter";
}

console.log(findSeason("Jan", 25));
console.log(findSeason("Feb", 25));
console.log(findSeason("Mar", 25));
console.log(findSeason("Apr", 28));
console.log(findSeason("May", 25));
console.log(findSeason("Jun", 25));
console.log(findSeason("Jul", 25));
console.log(findSeason("Aug", 25));
console.log(findSeason("Sep", 25));
console.log(findSeason("Oct", 25));
console.log(findSeason("Nov", 25));
console.log(findSeason("Dec", 25));

Это простое сравнение строк. Первый тест, который соответствует, возвращает сезон. Если тестовых матчей нет (последние дни декабря), то возвращаем Winter.

person ATD    schedule 25.09.2020
comment
Ты не собираешься добавить часть // convert to string in "MMDD" format? - person nick zoum; 25.09.2020
comment
Это будет полностью зависеть от того, как определены части месяца и дня — они могут уже быть в объекте Date или они могут быть выбраны пользователем или получены из текстовой строки innerHTML. Все, что показал OP, было предоставлено с датой - это может означать один из множества разных форматов. Если бы исходный формат был известен, то да, я мог бы добавить скрипт преобразования. - person ATD; 25.09.2020
comment
спросил оп по поводу вопроса, сказал строковую форму. - person nick zoum; 25.09.2020

Вы можете создать объект, содержащий каждый сезон, каждый сезон заканчивается, а затем найти первый сезон, дата которого больше указанной (если не найден круг до 1-го).

Проблема в том, что вам нужно преобразовать Dec и 23 в объект даты. Простой способ сделать это - создать массив всех месяцев, и всякий раз, когда вам нужно найти сезон, получите индекс месяца в этом массиве и используйте его следующим образом new Date(_year_, _index_, _date_).

var year = new Date().getFullYear();
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var seasons = {
  "Winter": new Date(year, 2, 20),
  "Spring": new Date(year, 5, 21),
  "Summer": new Date(year, 8, 22),
  "Autumn": new Date(year, 11, 21)
};

console.log(getSeason("Jan", 20));
console.log(getSeason("Feb", 20));
console.log(getSeason("Mar", 20));
console.log(getSeason("Apr", 20));
console.log(getSeason("May", 20));
console.log(getSeason("Jun", 20));
console.log(getSeason("Jul", 20));
console.log(getSeason("Aug", 20));
console.log(getSeason("Sep", 20));
console.log(getSeason("Oct", 20));
console.log(getSeason("Nov", 20));
console.log(getSeason("Dec", 20));
console.log(getSeason("Dec", 22));

function getSeason(month, day) {
  var index = months.indexOf(month);
  var newDate = new Date(year, index, day);
  for (var key in seasons) {
    if (newDate < seasons[key]) return key;
  }
  return Object.keys(seasons)[0];
}

person nick zoum    schedule 25.09.2020

Есть и другой способ использования условных выражений, который тоже работает (см. ниже). Большое спасибо за все предложения!

let month = 'Apr';
let date = 3;

switch (month) {
    case "Mar":
        if (date >= 1 && date <= 19) {
            console.log("Winter");
        } else if (date >= 20 && date <= 31) {
            console.log("Spring");
            break;
        }
    case "Apr":
        if (date >= 1 && date <= 30) {
            console.log("Spring");
            break;
        }
    case "May":
        if (date >= 1 && date <= 31) {
            console.log("Spring");
            break;
        }
    case "Jun":
        if (date >= 1 && date <= 20) {
            console.log("Spring");
        } else if (date >= 21 && date <= 30) {
            console.log("Summer");
            break;
        }
    case "Jul":
        if (date >= 1 && date <= 31) {
            console.log("Summer");
            break;
        }
    case "Aug":
        if (date >= 1 && date <= 31) {
            console.log("Summer");
            break;
        }
    case "Sep":
        if (date >= 1 && date <= 21) {
            console.log("Summer");
        } else if (date >= 22 && date <= 30) {
            console.log("Autumn");
            break;
        }
    case "Oct":
        if (date >= 1 && date <= 31) {
            console.log("Autumn");
            break;
        }
    case "Nov":
        if (date >= 1 && date <= 30) {
            console.log("Autumn");
            break;
        }
    case "Dec":
        if (date >= 1 && date <= 21) {
            console.log("Autumn");
        } else if (date >= 22 && date <= 31) {
            console.log("Winter");
            break;
        }
    case "Jan":
        if (date >= 1 && date <= 31) {
            console.log("Winter");
            break;
        }
    case "Feb":
        if (date >= 1 && date <= 29) {
            console.log("Winter");
            break;
        }
};
person Georgi Popov    schedule 25.09.2020