Pernyataan bersyarat - menentukan musim

Saya melakukan latihan untuk menentukan musim berdasarkan tanggal yang ditentukan secara spesifik. Di bawah ini adalah kode saya dan berfungsi, tetapi pasti ada cara yang lebih baik... Saya ingin menggunakan pernyataan kondisional untuk solusi saya. Masukannya adalah:

  • bulan sebagai string
  • tanggal sebagai angka

Tanggal Mulai Musim Musim Semi 20 Maret, Musim Panas 21 Juni, Musim Gugur 22 September, Musim Dingin 21 Desember

Bantuan apa pun akan sangat dihargai!

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 sumber
comment
Apakah ini menjawab pertanyaan Anda? Kode Javascript: Masukkan tanggal tertentu, Keluarkan musim   -  person Christian Baumann    schedule 25.09.2020
comment
Saya telah melalui ini dan dari apa yang saya lihat, solusi yang diterima serta beberapa solusi lainnya, tidak menyertakan informasi tentang cara mengimplementasikan input angka dalam solusi. Saya telah melihat ada solusi hebat yang lebih kompleks, namun tampaknya sangat berbeda dari apa yang ingin saya capai :)   -  person Georgi Popov    schedule 25.09.2020
comment
@GeorgiPopov Bagaimana bulannya dipilih? Apakah latihan ini hanya memberi Anda bulan dalam bentuk string atau apakah akan ada drop-down yang dapat Anda gunakan untuk memilih bulan?   -  person nick zoum    schedule 25.09.2020
comment
Maaf saya seharusnya memberikan info itu pada awalnya. Hanya bentuk string.   -  person Georgi Popov    schedule 25.09.2020
comment
Oke - Saya telah memperbarui kode saya untuk berasumsi bahwa bulan adalah string 3 karakter dan hari adalah angka. Saya hanya membuat string dalam format MMDD dan melakukan tes seperti sebelumnya.   -  person ATD    schedule 25.09.2020


Jawaban (3)


Jika Anda dapat mengubah tanggal menjadi string dalam format MMDD, Anda dapat melakukan:

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));

Ini hanyalah perbandingan string sederhana. Tes pertama yang cocok, mengembalikan musim. Jika tidak ada uji coba yang cocok (beberapa hari terakhir di bulan Desember), kembalikan Musim Dingin.

person ATD    schedule 25.09.2020
comment
Apakah Anda tidak akan menambahkan bagian // convert to string in "MMDD" format? - person nick zoum; 25.09.2020
comment
Itu sepenuhnya tergantung pada bagaimana bagian bulan dan hari ditentukan - mereka bisa saja sudah ada di objek Tanggal atau bisa dipilih oleh pengguna atau berasal dari string teks innerHTML. Semua OP yang ditampilkan diberi tanggal - itu bisa berarti salah satu dari banyak format berbeda. Jika format aslinya diketahui, ya, saya dapat menambahkan skrip konversi. - person ATD; 25.09.2020
comment
ditanya op mengenai pertanyaan itu, kata string form. - person nick zoum; 25.09.2020

Anda dapat membuat objek yang berisi setiap musim di setiap akhir musim dan kemudian menemukan musim pertama yang tanggalnya lebih besar dari yang disediakan (jika tidak ditemukan, lingkari ke tanggal 1).

Masalahnya adalah Anda perlu mengubah Des dan 23 menjadi objek tanggal. Cara mudah untuk melakukan ini adalah membuat array yang berisi semua bulan dan kapan pun Anda perlu mencari musim, dapatkan indeks bulan pada Array itu dan gunakan seperti 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

Ada cara lain menggunakan kondisional yang juga berfungsi (lihat di bawah). Terima kasih banyak atas semua sarannya!

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