Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Как думаете, можно ли так делать? (https://javascript.ru/forum/css-html/80158-kak-dumaete-mozhno-li-tak-delat.html)

Космос 04.05.2020 07:38

Как думаете, можно ли так делать?
 
Здравствуйте, пишу календарь, решил сформировать массив вот так:

for(var a in b = {"start - 1": "x + (count[(month ? (month - 1) : 11)] - (start - 2))", "count[month]": "i", "49 - (c + 1)": "i"}){

var i = 0, c = days.length - 1;

Array.from(Array(eval(a)).keys(), x => {

i++;
days[c + i] = eval(b[a]);

});

}

Как думаете, можно ли так писать?

P.S.: Код по ссылкам написан для наглядности, интересует Ваше мнение именно по этому фрагменту кода.

Полный пример находится тут https://codepen.io/cosmoweber/pen/xxwPaPN

Просмотр https://codepen.io/cosmoweber/full/xxwPaPN

рони 04.05.2020 13:37

календарь, вывод месяца, смена языка.
 
Космос,
на всякий случай, вариант без eval.
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Calendar</title>
  </head>
  <body>
    <style>

      .day {
        border: 1px solid #ccc;
        width: 30px;
        line-height: 30px;
        text-align: center;
        margin: 1px;
        background-color: #B0C4DE;
      }
      .month :nth-child(1) {
        width: 100%;
        flex:  0 0 auto;
        margin-left: auto;
        margin-right: auto;
        text-align: center;

      }
      .month :nth-child(1):first-letter {
        text-transform: capitalize;
      }

      .month {
          display: flex;
          flex-wrap:wrap;
          width: 238px;
          height: 238px;
          justify-content: space-around;
          margin: 30px auto;
      }
      .month.vert{
          flex-direction: column;
      }
      .day.holidays{
         background-color:  #FF85C6;
      }
      .day.op{
          opacity: .6;
          background-color:  #D3D3D3;
      }

      .day:nth-child(-n + 8) {
          color: #FFFFFF;
          font-weight: bold;
      }
     </style>
    <div class="ru month"></div>
    <button type="button" onclick="calendarRu.up(1)">следующий месяц</button>
    <div class="en month"></div>
    <button type="button" onclick="calendarEn.up(1)">next month</button>
    <script>
class Calendar {
    constructor(year, month, lang = 'ru', element) {
        this.year = year;
        this.month = month - 1;
        this.lang = lang;
        this.startDay = {
            ru: 1,
            en: 7
        };
        this.element = element;
        this.days = {
            "en": ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
            "ru": ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]
        };
        this.holidays = {
            en: [6, 0],
            ru: [6, 0]
        }
        this.up = this.render.bind(this);
        this.up();
    }
    update(up = 0) {
        this.month += up;
        let stepDay = new Date(this.year, this.month, 1);
        this.nameMonth = new Intl.DateTimeFormat(this.lang, {
        month: "long", year : 'numeric'}).format(stepDay);
        let deltaDay = (7 + (stepDay.getDay() || 7) - this.startDay[this.lang]) % 7;
        stepDay.setDate(stepDay.getDate() - deltaDay);
        let data = this.days[this.lang].map((date, i) => ({
            day: (i + this.startDay[this.lang]) % 7,
            date
        }));
        let lastDay = new Date(stepDay);
        lastDay.setDate(lastDay.getDate() + 41);
        while (stepDay <= lastDay) {
            data.push({
                day: stepDay.getDay(),
                date: stepDay.getDate()
            });
            stepDay.setHours(24);
        }
        return data;
    }
    render(up) {
        let data = this.update(up);
        let op = false;
        let html = `<h3>${this.nameMonth}</h3>`;
        for (let i = 0; i < data.length; i++) {
            let {day, date} = data[i];
            if (i == 7) op = true
            if (date == 1)  op = !op;
            let cls = this.holidays[this.lang].includes(day) ? 'day holidays' : 'day';
            if (op) cls += ' op';
            html += `<div class="${cls}">${date}</div>`;
        }
        this.element.innerHTML = html;
    }
}
let elemRu = document.querySelector('.ru');
let calendarRu = new Calendar(2020, 5, 'ru', elemRu);
let elemEn = document.querySelector('.en');
let calendarEn = new Calendar(2020, 5, 'en', elemEn);

    </script>
  </body>
</html>

Nexus 04.05.2020 14:44

Цитата:

Сообщение от Космос
for(var a in b = {"start - 1": "x + (count[(month ? (month - 1) : 11)] - (start - 2))", "count[month]": "i", "49 - (c + 1)": "i"}){

Цитата:

Сообщение от Космос
можно ли так делать?

Нельзя.

Вынесите инициализацию переменной «b» из for;
Давайте осмысленные названия переменным;
Избавьтесь от eval (вам они не нужны, вашу задумку можно и без eval реализовать).

Космос 05.05.2020 05:32

Цитата:

Сообщение от Nexus (Сообщение 523784)
Избавьтесь от eval (вам они не нужны, вашу задумку можно и без eval реализовать).

То что можно без eval это да, eval я применил, чтобы код меньше получился, а чем eval плох в данном случае?


Часовой пояс GMT +3, время: 14:45.