Saya ingin menentukan hari kerja/kerja berikutnya dan memperhitungkan hari libur. Untuk hari kerja, saya tidak termasuk hari Minggu & Sabtu. Untuk liburan, saya mengecualikan array objek tanggal.

Saya telah menyusun loop do-while untuk menambah setidaknya satu hari, dan terus menambahkan jika itu akhir pekan atau hari libur. Sementara upaya saya berhasil, saya yakin ada banyak ruang untuk perbaikan dengan memanfaatkan fitur sintaks node/ES terbaru. Catatan, saya terbatas pada vanilla JavaScript dari versi apa pun, tetapi sebaiknya menggunakan fitur modern (mis., Fungsi panah & semua).

Kondisi saya untuk mengecualikan akhir pekan adalah:

function nextWorkingDay(date) {
  do {
    date.setDate(date.getDate() + 1);
  } while (!(date.getDay() % 6));
  return date;
}

Dikombinasikan dengan upaya mengecualikan hari libur adalah:

const holidays = [new Date(2019, 11, 24), new Date(2019, 11, 25), new Date(2019, 11, 26), new Date(2019, 11, 31), new Date(2020, 0, 1)];

function checkHolidays(holidays, date) {
  return holidays.some(function (holiday_date) {
    return date.setHours(0, 0, 0, 0) === holiday_date.setHours(0, 0, 0, 0);
  })
}

function nextWorkingDay(date) {
  do {
    date.setDate(date.getDate() + 1);
  } while (checkHolidays(holidays, date) || !(date.getDay() % 6));
  return date;
}

Meskipun ini berhasil, saya yakin ini dapat disederhanakan dan menghapus fungsi checkHolidays yang terpisah sama sekali. Saya kesulitan menerapkan .includes() karena larik hari libur memiliki waktu yang berbeda untuk new Date() diteruskan ke fungsi.

Setiap saran/saran untuk perbaikan lebih lanjut akan sangat dihargai. Terima kasih atas waktunya.

0
Rick 29 Oktober 2019, 14:03

1 menjawab

Jawaban Terbaik

Kode Anda terlihat baik-baik saja. Jika Anda ingin menggunakan include, Anda dapat mempertimbangkan pendekatan ini, karena larik liburan ditentukan oleh Anda.

const holidays=['2019-12-24', '2019-12-25']; //etc

Kemudian Anda dapat menggunakan

holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate());

Dengan cara ini, susunan liburan Anda juga lebih 'dapat dibaca manusia'.

Jika Anda benar-benar ingin refactor menjadi satu fungsi, Anda dapat mencoba pendekatan rekursif.

function nextWorkingDay(date){
   if(date.getDay() % 6 == 0 || holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate())){
      return nextWorkingDay (new Date(date.setDate(date.getDate()+1)));
   }else return date;
}

Secara pribadi, meskipun rekursi ini keren dan lebih pendek, saya lebih suka gaya asli Anda untuk memisahkan keduanya. Dalam proyek besar, Anda tidak pernah tahu kapan Anda mungkin perlu memeriksa apakah itu hari libur, tanpa peduli apakah itu hari Minggu. Dalam hal ini, fungsi liburan Anda akan dapat digunakan kembali.

Catatan: diketik di ponsel saat bepergian, kode belum diuji .. tapi saya harap Anda mengerti!

Sunting: Untuk memulai hari berikutnya: Panggil fungsi di atas dengan hari berikutnya :p, atau fungsi yang dimodifikasi di bawah

function nextWorkingDay(date){              
   date.setDate(date.getDate()+1);
   if(date.getDay() % 6 == 0 || holidays.includes(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate())){
      return nextWorkingDay (date);
   }else return date;
}

Garpu CodePen:https://codepen.io/peekolo/pen/RwwLKYX?editors=0012

0
peekolo 29 Oktober 2019, 23:37