Какой сегодня день?

Пока решал эту задачу, несколько раз возникала мысль, что наверняка есть способ попроще, строчки на 3-4. Но как с самого начала мне пришло в голову, что надо через новый массив делать, так и не отступала. Когда прошел испытание и заглянул на форум, засмеялся — увидел способ с остатком от деления. 4 строчки.
Скажите, имеет право на жизнь такой способ? (работает)

Через создание нового массива
var days = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];

var getDayOfWeek = function (weekday, chosenDay) {
  var daysArr = [];
  
  if (chosenDay < 1 || chosenDay > 31) {
    return 'введите значение от 1 до 31';
  }
  
  for (var i = 0; i < days.length; i++) {
    var shift = days.indexOf(weekday) + i;
    if (shift < days.length) {
      daysArr.push(days[shift]);
    } else {
      daysArr.push(days[shift - days.length]);
    }
    for (var j = 0; j < chosenDay; j++) {
      if (chosenDay > days.length) {
        chosenDay -= days.length;  
      }
    }
  }
  console.log(daysArr);
  return daysArr[chosenDay - 1];
}

Если он имеет право на жизнь, то может есть, что улучшить?

Конкретно под условия задачи и если у пользователя нет возможности ошибиться(кнопочки там с днями недели у первого числа и список с числом месяца), то подойдет вот такое решение
var getDayOfWeek = function(firstDayOfWeek, number){
var dayOfWeek = [‘понедельник’,‘вторник’,‘среда’,‘четверг’,‘пятница’,‘суббота’,‘воскресенье’];
return dayOfWeek[(dayOfWeek.indexOf(firstDayOfWeek) - 1 + number) % 7];
}

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

var getDayOfWeek = function(weekDay, number) {
  var weekDays = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
  
  for (var i = 0; i < 7; i++) {
    if (weekDay === weekDays[i]) {
      return(weekDays[(i + number - 1) % 7]); 
    }
  }
}
3 лайка

Решенька без циклов и условий:

Сводка

var getDayOfWeek = function(weekday, data) {
var weekDayS=[‘понедельник’,‘вторник’,‘среда’,‘четверг’,‘пятница’,‘суббота’,‘воскресенье’];
var count =weekDayS.indexOf(weekday)+ data%7-1;
return weekDayS[count];
}

Попробуйте вызвать: getDayOfWeek(‘понедельник’, 7);

3 лайка

все-таки придется добавить условие

нет, не придется =) подумайте, нужно чуть изменить работу с остатком

1 лайк

да, что-то сразу в голову не пришло)

итог

(weekDayS.indexOf(weekday)-1 + data)%7;

Блин полчаса пытался решить с отрицательными индексами массива (по пути питонщика), чтобы решить проблему выхода за пределы максимально индекса, пока осознал что в чертовом js нет отрицательных индексов в обычном понимании, и нельзя закольцевать массив таким образом…насколько же питон в этом плане удобнее!
Но в итоге оказалось что в проверку вообще не добавили такой вариант где в итоге приходилось бы выходить за границы массива и работает даже не до конца правильное решение:

var getDayOfWeek = function (firstDay, requiredDate) {

var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
var day = week.indexOf(firstDay);
var sediment = requiredDate % 7 - 1;
var wantedDay = week[day + sediment];
return wantedDay;
};

То есть, если мы возьмем первый день воскресенье, а дату, например 20 число. То остаток от деления будет 20 % 7 = 5. Далее 5-1 = 4. И будем искать в массиве элемент с индексом 6 (изначальный индекс воскресенья) + 4 = 10, которого там нет…

Решается, путем добавления проверки, если выходим за 6 в итоге, то вычитаем из финального индекса 7:

var getDayOfWeek = function (firstDay, requiredDate) {

var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
var day = week.indexOf(firstDay);
var sediment = requiredDate % 7 - 1;
var index = day + sediment;
if (index > 6) {
index -= 7;
}
var wantedDay = week[index];
return wantedDay;
};

велосипед придумали. без колес, зато на гусеницах. нафига брать остаток от даты, чтобы потом оперировать с ним? остаток и должен быть индексом элемента словаря.

хм. а если с проверкой?
var getDayOfWeek = function(firstDayOfMounth, DayOfWeek){
var week = [‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’]
currentDay = week.indexOf(firstDayOfMounth) + (DayOfWeek % 7 - 1);
if (currentDay < 0){
currentDay = week.indexOf(firstDayOfMounth) + 6;
}
return week[currentDay];
}

В 2 строчки вышло, хотя сначала думал делить массив на части и менять в нем элементы))
const daysOfWeek = [
   'понедельник',
   'вторник',
   'среда',
   'четверг',
   'пятница',
   'суббота',
   'воскресенье'
]; 

const getDayOfWeek = (firstDay, dayToFind) => {
  const dayToCount = daysOfWeek.findIndex(el => el === firstDay) - 1;
  return daysOfWeek[dayToFind % 7 + dayToCount];
};
вот я д*****б :D

var getDayOfWeek = function(dayOfWeek,number){
if (dayOfWeek===‘понедельник’){
for(var i=1;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘воскресенье’){
for(var i=2;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘суббота’){
for(var i=3;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘пятница’){
for(var i=4;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘четверг’){
for(var i=5;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘среда’){
for(var i=6;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
if (dayOfWeek===‘вторник’){
for(var i=7;i<=32;i+=7){
if (number===i){
return ‘понедельник’
}
else if (number===i-1){
return ‘воскресенье’}
else if (number===i-2){
return ‘суббота’}
else if (number===i-3){
return ‘пятница’}
else if (number===i-4){
return ‘четверг’}
else if (number===i-5){
return ‘среда’}
else if (number===i-6){
return ‘вторник’}
}
}
}

Такое можно сократить?

мощно. ну можно прибавить dayOfWeek (которому соответствует числовое значение) к number, в цикле уменьшить эту сумму до числа меньше 8, убавляя по неделе (по 7) на каждой итерации и потом расшифровать обратно в строку-название дня недели.
ну это на случай если “влом” с остатком от деления, массивами или объектами разбираться =)

упоротый вариант
var getDayOfWeek = function(firstDay, dayX) {
  switch (firstDay) {
    case "вторник":
      dayX += 1;
      break;
    case "среда":
      dayX += 2;
      break;
    case "четверг":
      dayX += 3;
      break;
    case "пятница":
      dayX += 4;
      break;
    case "суббота":
      dayX += 5;
      break;
    case "воскресенье":
      dayX += 6;
      break;
  }
  while (dayX >= 8) {
    dayX -= 7;
  }
  switch (dayX) {
    case 1:
      dayX = "понедельник";
      break;
    case 2:
      dayX = "вторник";
      break;
    case 3:
      dayX = "среда";
      break;
    case 4:
      dayX = "четверг";
      break;
    case 5:
      dayX = "пятница";
      break;
    case 6:
      dayX = "суббота";
      break;
    case 7:
      dayX = "воскресенье";
      break;
  }
  return dayX;
}

а вообще тут через массив делается :grin:

Сделала через массив, но задолбалась искать нужную строку. Может, кто знает простые способы поиска по массиву, без перебирания циклом?

Сводка

var getDayOfWeek = function (firstMonthDay, current) {
var daysNames = [‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’];
var firstDayIndex = 0;
var currentIndex = 0;
for (var i = 0; i < daysNames.length; i++) {
if (firstMonthDay === daysNames[i]) {
firstDayIndex = i;
};
};
currentIndex = ((current - (7 - firstDayIndex + 1)) % 7);
return daysNames[currentIndex];
};

  const getDayOfWeek = (day, date) => {
    const days = ["понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"];
    return days[(date % 7) + days.indexOf(day) - 1];
  };

Проверку проходит не совсем правильный код: return week[requiredDate % 7 + i-1]; Если вызвать функцию с такими параметрами, .getDayOfWeek(‘воскресенье’,2); то получаем undefined, хотя логика подсказывает, что должен быть понедельник. Индекс ‘воскресенье’ - 6, последний элемент в массиве. Остаток от деления 2 - 2. Итого 2 + 6 - 1 = 7, что уже вылезло за пределы массива. Ну раз вылезло, значит надо его туда вернуть. Еще один остаток от деления и все ОК. 7/7 без остатка, вот вам 0, т.е.‘понедельник’.

1 лайк

Оцените, пожалуйста, решение

var daysOfWeek = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
var getDayOfWeek = function (firstDayOfMonth, dateOfMonth) {
  for (var i=0; i<daysOfWeek.length; i++) {
    if (daysOfWeek[i].indexOf(firstDayOfMonth) ==0) {
    var firstDateIndex = i;
    }   
  }
  if (firstDateIndex + dateOfMonth%7<= daysOfWeek.length ) {
     return daysOfWeek[firstDateIndex + dateOfMonth%7 -1]
  } else {
    return daysOfWeek[firstDateIndex + dateOfMonth%7 -1 -daysOfWeek.length]
  }
  }

Вот мой вариант:

var getDayOfWeek = function(firstDayAtMonth, dayOfMonths)
{
  var daysOfWeek = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']

  var indexOfFirstDayAtMonth;
  
  for (var i = 0; i < daysOfWeek.length; i++)
  {
    if (daysOfWeek[i] === firstDayAtMonth)
    {
      indexOfFirstDayAtMonth = i;
    }
  }
  
  for (var i = 0; i < indexOfFirstDayAtMonth; i++)
  {
    var swap = (daysOfWeek.shift());
    daysOfWeek.push(swap);
  }
  
  if (dayOfMonths % 7 == 0)
  {
    result = daysOfWeek[6];
  }
  else
  {
    result = daysOfWeek[dayOfMonths % 7 - 1];
  }
  
  return result;
}