Использование lodash pad для форматирования самого первого числа цикла for на основе условия - PullRequest
0 голосов
/ 29 марта 2019

Я создал календарь console.log через узел js с использованием механизма момента.Моя проблема заключается в применении подкладки специально в первый день месяца, чтобы он соответствовал его дню.Например, если у них первый день - четверг, я бы хотел, чтобы первый день (1) начинался в четверг, а затем прерывался после субботы.Наконец, он прерывался и продолжал цикл, чтобы разбить строку через каждые 7 дней.

На данный момент мой Календарь действительно запускается с первого дня и прерывается правильно, но первый день (1) всегда включенВоскресенье из-за моего непонимания о том, как набить первый номер.Еще одна вещь, на которую стоит обратить внимание, это то, что мой календарь сейчас показывает только 7, но это потому, что я знаю, как делать правильные отступы / разрывы строк после первой строки.

let days = moment.weekdays().join(' ');
// Array of months
let theMonths = moment.monthsShort();

// Creation of each month
for (i = 0; i < theMonths.length; i++) {
  // Assigns each month to a variable to call moment functions
  var eachMonth = moment().month(theMonths[i]);
  // Creates calendar for each month
  console.log("-------" + theMonths[i] + "------");
  console.log(days);
  console.log(monthDays(eachMonth))
}

// this function handles creating all days of each month
function monthDays(month) {

  let display = '';
  for (x = 1; x <= month.daysInMonth(); x++) {
    if (x <= 7) {
      var holder = moment.weekdays().length;
      // subtracting the length of the week from the starting day of each month
      var firstLine = holder - month.weekday();
      // will break line based on first day
      if (x == firstLine) {
        display += "   " + x + "\n";
      } else {
        // padding for each number after(if neccesary) line break
        display += _.pad(x + " ", 8);

      }
    }
  }
  console.log(display)
}     

Ожидаемые результаты:

    Oct has: 31 days the first day is: 2
    -------Oct------
    Sunday Monday Tuesday Wednesday Thursday Friday Saturday
                      1       2       3       4       5
       6       7      etc.

Фактические результаты:

    Oct has: 31 days the first day is: 2
    -------Oct------
    Sunday Monday Tuesday Wednesday Thursday Friday Saturday
       1       2       3       4       5
       6       7       etc.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Некоторые проблемы:

  • Вы предполагаете, что month.weekday(); получает день недели первого дня месяца, но вы, когда вы просто создаете момент для месяца, текущий день и время сохраняются в тот момент, поэтому вам необходимо подать .startOf("month")
  • Вы console.log возвращаемое значение вызова функции, но функция ничего не возвращает; вместо этого он выводит что-то сам.
  • В настоящее время вы выходите из цикла в день 7. Скорее всего, вы хотите вывести и другие дни месяца; -)
  • Вы используете глобальные переменные для переменных цикла. Убедитесь, что объявили их с локальной областью действия

Вот как ваш код может быть адаптирован. Комментарии указывают, где были сделаны изменения:

const days = moment.weekdays().join(' ');
const theMonths = moment.monthsShort();
/// Don't use a global variable -- declare i:
for (let i = 0; i < theMonths.length; i++) {
    const eachMonth = moment().month(theMonths[i]).startOf("month"); /// <--- get first day
    console.log("-------" + theMonths[i] + "------");
    console.log(days);
    console.log(monthDays(eachMonth));
}

function monthDays(month) {
    const shift = month.weekday(); // Get shift of "1"
    const holder = moment.weekdays().length;
    let display = ' '.repeat(8 * shift); // Create indentation for "1"
    for (let x = 1; x <= month.daysInMonth(); x++) {
        const firstLine = x > 1 && (x-1+shift) % holder == 0; // <-- the magic!
        if (firstLine) display += "\n";
        display += _.pad(x + " ", 8);
    }
    return display; // <--- return
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
0 голосов
/ 29 марта 2019

Вы можете использовать заполнение другим способом, вот пример и документация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

String.prototype.padStart();
String.prototype.padEnd();

Метод padStart() дополняет текущую строку другой строкой (несколько раз, если необходимо), пока результирующая строка не достигнет заданной длины. Заполнение применяется от начала (слева) текущей строки, также есть padEnd().

Если мы знаем, что самая длинная строка содержит, например, 7 букв, мы можем предположить, что заполнение из 10 сохранит все в строке.

// 'abc'.padStart(10);         // "       abc"
// 'abc'.padStart(10, "foo");  // "foofoofabc"

function output() {
    console.log('Expected Results:');
    console.log('Day has:', '# days from the first day is: #');
    console.log(
        ' Day'.padStart(0),
        'Day'.padStart(7),
        'Day'.padStart(7),
        'Day'.padStart(7),
        '\n',
        '#'.padStart(0),
        '#'.padStart(7),
        '#'.padStart(7),
        '#'.padStart(7),
        '\n',
        'Day'.padStart(0),
        'Day'.padStart(7),
        'Day'.padStart(7),
        'Day'.padStart(7),
        '\n',
        '#'.padStart(0),
        '#'.padStart(7),
        '#'.padStart(7),
        '#'.padStart(7),
    );
}

output();

Тогда, если вы используете Node.JS, вы можете использовать padStart() и padEnd() в сочетании с шириной терминала.

console.log('Size' + process.stdout.columns + 'x' + process.stdout.rows);
...