if и else условие
Не знаю как написать условие(if, else) для скрипта.
if (h === 8 && minutes === 0) {b = 'Пары еще не начались '; sebastian.children[0].innerHTML = b;} else if ((h === 9 && minutes > 0) && (h===9 && minutes <45)) {b = 'Первый час, первой пары '; sebastian.children[0].innerHTML = b;} else if ((h === 9 && minutes > 45) && (h === 9 && minutes < 50)) { b = 'Перемена 5 минут '; sebastian.children[0].innerHTML = b;} else if ((h === 9 && minutes > 50) && (h === 10 && minutes < 35)) { b = 'Второй час, первой пары '; sebastian.children[0].innerHTML = b;} else if ((h === 10 && minutes > 35) && (h === 10 && minutes < 45)) {b = 'Конец первой пары. Перемена на 10 минут '; sebastian.children[0].innerHTML = b;} else if ((h === 10 && minutes > 45) && (h === 11 && minutes < 30)) {b = 'Первый час, второй пары '; sebastian.children[0].innerHTML = b;} else if ((h === 11 && minutes > 30) && (h === 11 && minutes < 35)) {b = 'Перемена 5 минут '; sebastian.children[0].innerHTML = b;} else if ((h === 11 && minutes > 35) && (h === 12 && minutes < 20)) {b = 'Второй час, второй пары '; sebastian.children[0].innerHTML = b;} else if ((h === 12 && minutes > 20) && (h === 12 && minutes < 40)) {b = 'Большая перемена '; sebastian.children[0].innerHTML = b;} else if ((h === 12 && minutes > 40) && (h === 13 && minutes < 25)) {b = 'Первый час, третьей пары. Перемена на 10 минут '; sebastian.children[0].innerHTML = b;} else if ((h === 13 && minutes > 25) && (h === 13 && minutes < 30)) {b = 'Перемена 5 минут '; sebastian.children[0].innerHTML = b;} else if ((h === 13 && minutes > 30)&&(h===14 && minutes ===15)) {b = 'Второй час, третьей пары '; sebastian.children[0].innerHTML = b;} else { b = 'Наконец то закончились эти пары '; sebastian.children[0].innerHTML = b;} подправьте пожалуйста :( |
Насколько я понял (не знаю как звучит ваше имя), вы хотите получить более читабельный и легко модернизируемый код (это и увеличивает вероятность его работоспособности), так как в нём наблюдаются некоторые одинаковые части, а также много операторов if-else.
Если это так, то 1) используйте оператор switch вместе с оператором if (switch более читабельный, но выражение в нём должно возвращать конкретное значение, таким значение в вашем случае будут часы, для проверки неравенств придётся использовать if); 2) повторяющиеся конструкции обозначьте более короткими именами; 3) попробуйте в принципе сократить условия. Комментирую. Если вы понимаете, что h - это часы, то зачем обозначать минуты длинным словом minutes, логичнее использовать обозначение просто m. Зачем использовать лишнюю переменную b, если она нужна лишь для того, чтобы установить значение всего лишь одного элемента (в вашем случае этот элемент sebastian.children[0].innerHTML), логичнее сразу присваивать это значение. Элемент sebastian.children[0].innerHTML необходимо сократить в написании, например, так g = sebastian.children[0]; (ссылка на ваш элемент children), а далее g.innerHTML. Зачем делать проверки подобные m>0, если m итак заведомо больше нуля. Так как я не знаю, что вы имели ввиду под элементом sebastian.children[0], то привожу пример, для простого div, в который по нажатию кнопки "Сейчас", будет выводиться ответ. В данном коде я использую разбивку по часам, что довольно удобно, а так как вариантов у вас много, привожу для примера несколько первых из них. Итак, вот он код: Код:
<div id=s style="background: yellow">Нажми на кнопку, что понять, что сейчас</div> |
Найдите все отличия:
if (h === 8) { b = 'Пары еще не начались '; } else if(h === 9 && minutes > 0 && minutes < 45) { b = 'Первый час, первой пары '; } else if(h === 9 && minutes >= 45 && minutes < 50) { b = 'Перемена 5 минут '; } else if((h === 9 && minutes >= 50) || (h === 10 && minutes < 35)) { b = 'Второй час, первой пары '; } else if (h === 10 && minutes >= 35 && minutes < 45) { b = 'Конец первой пары. Перемена на 10 минут '; } else if ((h === 10 && minutes >= 45) || (h === 11 && minutes < 30)) { b = 'Первый час, второй пары '; } else if (h === 11 && minutes >= 30 && minutes < 35) { b = 'Перемена 5 минут '; } else if ((h === 11 && minutes >= 35) || (h === 12 && minutes < 20)) { b = 'Второй час, второй пары '; } else if (h === 12 && minutes >= 20 && minutes < 40) { b = 'Большая перемена '; } else if ((h === 12 && minutes >= 40) && (h === 13 && minutes < 25)) { b = 'Первый час, третьей пары. Перемена на 10 минут '; } else if (h === 13 && minutes >= 25 && minutes < 30) { b = 'Перемена 5 минут '; } else if ((h === 13 && minutes >= 30) || (h === 14 && minutes <= 15)) { b = 'Второй час, третьей пары '; } else { b = 'Наконец то закончились эти пары '; } sebastian.children[0].innerHTML = b; |
Хорошее, сокращающее код, решение, GuardCat, также в данном решении код обработки данных отделяется от кода вывода этих данных, что очень удобно при различных модификациях (а вот коду можно придать и более читабельную форму, так как читабельность - основа безошибочности).
В применении к представленному мною коду вместо g.innerHTML можно записать ту же b, а потом в конце, присвоить её в выражении document.getElementById('s').innerHTML = b. |
Maxmaxmахimus, с простым условием понятно как так сделать. Как быть со сложными условиями? Эвалить? Если есть время, скажу спасибо за код.
|
Приведи детишкам, отец Maxmaxmахimus, реализацию твоего варианта для данной ситуации
|
вывести полный скрипт? я просто только часть написал где условия...
Цитата:
Ув. besиGuardCat спасибо вам за помощь... А дядюшка Maxmaxmахimus, я еще раз говорю, не все такими умными родились, как вы. |
спасибо папаша:victory:
|
Неплохая идея, Maxmaxmахimus, для реализации её опытными программистами, которые понимают как использовать регулярные выражения и как работают фнукции forEach и match, явно не для новичков (хотя разобраться можно).
Кроме того, следует понимать, что данный код не кроссбраузерный, так как функция forEach работает не во всех браузерах, в качестве альтернативы (со своими демонами) можно для обхода всех элементов массива использовать цикл for (например, вида for (var key in arr) {var val = arr[key]} ). Также оптимизация требуется предпринять некоторые действия для прекращения выполнения forEach при нахождении требуемого значения, так как внутренняя функция в forEach выполняется для всех элементов массива (лично мне при помощи break) в Google Chrome этого сделать не удалось). Кроме того, я так понимаю, вы сознательно, захотели, чтобы при выводе всё время выводилось сообщение "приступ". С выводом значения при использовании forEach также не всё так просто, даже если убрать ваш return 'приступ', alert выведет underfined, так как return time[1] возвращает значение в никуда (а точнее только во внутреннюю функцию), решением может быть присвоение этого значения некоторой переменной (например, а = time[1]), а потом возвращение этого значения (вместо return 'приступ'; - return a;). PS: Свою гениальность или манию величия, Maxmaxmахimus, можешь проверить на моём вопросе http://javascript.ru/forum/misc/2678...avascript.html |
Цитата:
|
а как вывести текст вертикально?
|
вертикальный текст
Вложений: 1
|
Ирония, Maxmaxmахimus, это, конечно, хорошо (хочешь, чтобы регулярные выражения представлялись не литерально, создай среду, в которой они будут представляться, например, схематически).
Но к чему лирика, если сам заварил эту кашу, приведя пример, по которому возникают вопросы. Для эффективного применения предложенного тобой варианта решения, на мой взгляд, осталось разобраться с тем как досрочно выйти из функции forEach и с тем какие существуют варианты для возвращения значений из внутренней функции для этой forEach (вдобавок к предложенному мной), если знаешь, просвети. |
ааа... что там на счет вертикального текста;)
|
Maxmaxmахimus, давай решать задачи по порядку:
сначала доразберёмся с твоим примером, потом, если владеешь информацией, можешь помочь мне в вопросе http://javascript.ru/forum/misc/2678...avascript.html, ну а потом можно будет поговорить, как я понял, о твоей любимой теме - регулярных выражениях (средство не спорю мощное). |
Цитата:
Ваш способ применяется в большинстве случаев для обхода объектов. Цитата:
|
Цитата:
можно ли переменной присвоить таблицу |
Цитата:
|
Спасибо, melky, за то, что подключился к нашей беседе.
Да, такой способ наверное наиболее подходит для данной ситуации (хотя и пробежаться по объектам-массивам можно), в цикл for и break можно вставить. Не поленюсь, приведу, код подобного forEach работающего цикла для массива schedule (расчёт времени наверное логично вынести за пределы цикла). Код:
for (i = 0; i < schedule.length; i++) А результат работы внутренней функции в forEach можно вернуть через внешнюю переменную (я подумал может быть есть ещё какие-нибудь варианты). |
مراد,
Вариант... var schedule = [ [900, 'Пары еще не начались '], [945, 'Первый час, первой пары '], [950, 'Перемена 5 минут '], [1035, 'Второй час, первой пары '], [1045, 'Конец первой пары. Перемена на 10 минут '], [1130, 'Первый час, второй пары '], [1135, 'Перемена 5 минут '], [1220, 'Второй час, второй пары '], [1240, 'Большая перемена '], [1325, 'Первый час, третьей пары '], [1330, 'Перемена 5 минут '], [1415, 'Второй час, третьей пары '], [2359, 'Наконец то закончились эти пары '] ]; alert( testSchedule() ); function testSchedule() { var nowTime = new Date(), hours = nowTime.getHours(), minutes = nowTime.getMinutes(); var def = ''; for (var i=0; i<schedule.length; i++) { def = schedule[i][1]; if((hours*100)+minutes < schedule[i][0]) break; } return def; } |
Часовой пояс GMT +3, время: 09:44. |