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

Блин полчаса пытался решить с отрицательными индексами массива (по пути питонщика), чтобы решить проблему выхода за пределы максимально индекса, пока осознал что в чертовом 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, т.е.‘понедельник’.

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

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

:confused:

var week = ['понедельник',
            'вторник', 
            'среда', 
            'четверг', 
            'пятница', 
            'суббота', 
            'воскресенье']
  var getDayOfWeek = function(firstDay, findNumberDay) {
  var dayOfNumber = (week[(week.indexOf(firstDay) + findNumberDay - 1) % 7])
  return dayOfNumber
}

спасибо! Сейчас сяду разбираться

Мне кажется я замудрённо написал решение.
Может кто-то подскажет ревью.

Сводка

var getDayOfWeek = function (firstDayInMonth, searchDay) {
var dayWeek = [“понедельник”,“вторник”,“среда”,“четверг”,“пятница”,“суббота”,“воскресенье”];
var firstDayIndex = 0;
var result = “”;

for(var i = dayWeek.length; i > 0; i–){
if(firstDayInMonth === dayWeek[i])
firstDayIndex = i - 1;
}
var indexSearchDay = (searchDay % dayWeek.length) + firstDayIndex;

result = dayWeek[indexSearchDay];

return result;
}

У меня получилось так:

var getDayOfWeek=function(day, number){
var dayWeek=[‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’];
var indexDayFirst=dayWeek.indexOf(day);
var indexDay=number%7+indexDayFirst-1;
if (indexDay>6){
var dayNumber=dayWeek[indexDay%6];
}
else {
var dayNumber=dayWeek[indexDay];
}
return dayNumber;
}

Получилась такая вот картина. Приглашаю оценить и прокомментировать, что можно улучшить или сократить. К названиям переменных, просьба, не придираться))

var daysOfWeek = [‘понедельник’, ‘вторник’, ‘среда’, ‘четверг’, ‘пятница’, ‘суббота’, ‘воскресенье’];
var getDayOfWeek = function (firstDayOfMonth, isDayOfMonth) {
var numberOfFirstDay = daysOfWeek.indexOf(firstDayOfMonth);
var ostatok = isDayOfMonth % 7 - 1;
var omg = numberOfFirstDay + ostatok;
if ( omg <= 7) {
var answer = daysOfWeek[omg];
} else {
var gmo = omg % 7;
answer = daysOfWeek[gmo];
}
return answer;
}

как то так:

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

1 Симпатия

Пролистал ветку, решение не оригинальное (как придумал так и вышло ХД) , но хоть и не самое громоздкое, + это конечно все вкусовщина, но ИМХО более понятное чем записи в 1-2 строки, возможно через пол года/год я буду быстрее разбираться в однострочных конструкциях, но сейчас они для меня переусложнены (не, так то понятно что они делают но приходиться напрягаться…)

Творчество!
function getDayOfWeek(firstDayMonth, NumberDay) {
  var daysWeek = ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'];
 var NumDaysWeek = daysWeek.indexOf(firstDayMonth);
  var i = NumDaysWeek+NumberDay%7-1;
  if (i >= daysWeek.length) {
  i -= daysWeek.length;
  }
  return daysWeek[i];
}

Пришел к такому решению:

var getDayOfWeek = function (firDay, day) {
    var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
        var dayCount = week.indexOf(firDay);
        for (let i = 1; i < day; i++) {
            if (dayCount == 6) {
                dayCount = 0
            } else {
                dayCount += 1
            }
        }
    return week[dayCount]
}