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

var getDayOfWeek = function(firstDay, day) {

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

day += days.indexOf(firstDay)-1;
s = days[day % 7]
return s;
}

8 лайков

только параметр не очень хорошо переопределять, лучше завести переменную
и вернуть можно сразу выражение, без присвоения переменной, а то находите s и ниже тут же возвращаете.

1 лайк
код

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

2 лайка


Попробовал сделать через SWITCH. вроде работает.

Для каждого дня недели вы считаете одно и то же. Зачем тогда switch? (если понедельник, то 2+2, если вторник, то 2+2…)
И еще определение дня недели (когда вы находите остаток от деления на 7) у вас не учитывает день начала месяца.
Чтобы проверить работу программы можно вынести массив из функции:
var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];

var getDayOfWeek = function(dayOfWeek, date) {
	var a = date % 7 - 1;
	var day = '';

	switch(dayOfWeek) {
        case 'понедельник':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'вторник':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'среда':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'четверг':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'пятница':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'суббота':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
		case 'воскресенье':
			day = week[week.indexOf(dayOfWeek) + a];
			break;
	}

	return day;
}

и для каждого дня недели вызвать функцию и передать в нее дату - от 1 до 31, например.

for (var i = 0; i < week.length; i++) {
	for (var j = 1; j <=31; j++) {
		console.log('день начала месяца: ' + week[i], ' число: ' + j, 'искомый день недели: ' + getDayOfWeek(week[i], j));
	}
}

и посмотреть где у вас вернется undefined.

день начала месяца: воскресенье число: 1 искомый день недели: воскресенье
день начала месяца: воскресенье число: 2 искомый день недели: undefined
день начала месяца: воскресенье число: 3 искомый день недели: undefined
день начала месяца: воскресенье число: 4 искомый день недели: undefined
день начала месяца: воскресенье число: 5 искомый день недели: undefined
день начала месяца: воскресенье число: 6 искомый день недели: undefined

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

image

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

// индексИскомогоДня = (индексПервогоДня + номерИскомогоДня - 1 (отнимаем 1 потому что первый день уже учтен в числе requiredDay, в противном случае будем считать его два раза)). Для значений, превышающих длину массива, узнаём индекс нужного нам дня с помощью остатка при делении на семь (соответствует количеству элементов массива): week[15] превратится в week [1], такой код помогает обойтись без циклов и добавления новых элементов в массив.

14 лайков
Вариант
var getDayOfWeek = function (x, y) {
  var week = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']; 
  var shift = week.indexOf(x);
  var z = 0;
  if (y > 7) {
    z = y % 7 + shift - 1;
  } else {
    z = y + shift - 1;
  }
  return week[z];
};

Я сделаль :space_invader:

var getDayOfWeek = function (firstDayOfMonth, dayNumber){

var days = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье'];
var dayOfWeek = '';
var firstDayIndex = days.indexOf(firstDayOfMonth) - 1; 

if ( dayNumber % 7 === 0 ) {
  
  dayOfWeek = days[firstDayIndex];
  
} else if ( dayNumber < 7 && firstDayIndex + dayNumber >= days.length ){
  
  dayOfWeek = days[Math.abs( firstDayIndex + dayNumber - days.length )];

} else {
  
  var dayOfWeekIndex = dayNumber % 7;
  dayOfWeek = days[firstDayIndex + dayOfWeekIndex];
  
}

return dayOfWeek;

};

@yshmatlay
neededDay - что за зверь?

Сводка

не пробовали почитать объяснение Какой сегодня день? ?
кажется, что можно оптимизировать.

не шарите, она "сделяль"

Изменила название параметра функции с neededDay на dayNumber и провтыкала исправить в первой ветке проверки :astonished:

Прочитала вот… да, красивенько) но я до этого не додумалась :grin:

1 лайк

Пока решал эту задачу, несколько раз возникала мысль, что наверняка есть способ попроще, строчки на 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;
};