Пока решал эту задачу, несколько раз возникала мысль, что наверняка есть способ попроще, строчки на 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, data) {
var weekDayS=[‘понедельник’,‘вторник’,‘среда’,‘четверг’,‘пятница’,‘суббота’,‘воскресенье’];
var count =weekDayS.indexOf(weekday)+ data%7-1;
return weekDayS[count];
}
Блин полчаса пытался решить с отрицательными индексами массива (по пути питонщика), чтобы решить проблему выхода за пределы максимально индекса, пока осознал что в чертовом 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;
};
велосипед придумали. без колес, зато на гусеницах. нафига брать остаток от даты, чтобы потом оперировать с ним? остаток и должен быть индексом элемента словаря.
мощно. ну можно прибавить 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;
}
Проверку проходит не совсем правильный код: return week[requiredDate % 7 + i-1]; Если вызвать функцию с такими параметрами, .getDayOfWeek(‘воскресенье’,2); то получаем undefined, хотя логика подсказывает, что должен быть понедельник. Индекс ‘воскресенье’ - 6, последний элемент в массиве. Остаток от деления 2 - 2. Итого 2 + 6 - 1 = 7, что уже вылезло за пределы массива. Ну раз вылезло, значит надо его туда вернуть. Еще один остаток от деления и все ОК. 7/7 без остатка, вот вам 0, т.е.‘понедельник’.