Как агрегировать массивы дней в неделю в JS? - PullRequest
0 голосов
/ 02 ноября 2019

Например, возьмите временной интервал с 05/10/2019 по 05/25/2019.

Даты этого интервала необходимо агрегировать следующим образом (2019 для краткости опущено):

const result = [
  [                                    '05-10', '05-11', '05-12'], // week 1
  ['05-13', '05-14', '05-15', '05-16', '05-17', '05-18', '05-19'], // week 2
  ['05-20', '05-21', '05-22', '05-23', '05-24', '05-25'         ], // week 3
];

Как лучше всего решить эту проблему с помощью JS?
Можно ли реализовать это, задав начало недели для любого дня?
Будут ли пакеты moment и moment-range помочь в этом?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вот одна из возможных реализаций, если вас интересует moment.js код.

Но, как сказал blex , это большая библиотека.

const start = moment('2019-05-10');
const end = moment('2019-05-25');
const array = [[]];
const from_date = moment(start).startOf('isoWeek');
const to_date = moment(end).endOf('isoWeek');

let j = 0;
let added = 0;
for (let currentDate = moment(from_date); currentDate <= to_date; currentDate.add(1, 'day')) {
  if (added === 7) {
    array.push([]);
    j++;
    added = 0;
  }
  if (currentDate.isBetween(start, end, null, '[]')) {
    array[j].push(currentDate.format('MM-DD'));
  }
  else {
    array[j].push('');
  }
  added++;
}
document.getElementById('output').innerText = JSON.stringify(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<p id="output"></p>
1 голос
/ 02 ноября 2019

Вы можете просмотреть даты, и если день равен 1 (понедельник), создайте new Array в своих результатах:

const startDate = new Date('05-10-2019'),
    endDate = new Date('05-25-2019'),        
    result = [];

function _twoDigits(x) {
  return String(x).padStart(2, '0');
}

let tmp = startDate;
do {
  if (tmp.getDay() === 1 || result.length === 0) {
    // Create a week Array
    result.push([]);
  }
  const str = `${_twoDigits(tmp.getMonth() + 1)}-${_twoDigits(tmp.getDate())}`;
  // Add this date to the last week Array
  result[result.length - 1].push(str);
  // Add 24 hours
  tmp = new Date(tmp.getTime() + 86400000);
} while (tmp.getTime() <= endDate.getTime());

console.log(result);

Примечание: MomentJS может помочь, но это большая библиотека. Если вам нужно сделать 2 или 3 базовых действия с датами, я бы порекомендовал не использовать их. Если вам нужно много работать с датами, то да, это мощная библиотека, которая сэкономит вам много времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...