Получение даты дня X на неделе N - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть объект, который выглядит так:

const availability = {
        week1: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week2: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week3: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week4: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
    };

Показывает наличие кого-то на 1-й, 2-й, ... неделе текущего месяца.

Что мне сейчас нужно, так это дата каждого правдивого дня. Например, дата вторника первой недели этого месяца, дата вторника второй недели месяца и т. Д.

Я проверил date-fns и moment.js, но не могу понять, как мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Попробуйте

function isAGoodDay (date) {
  var weekOfMonth = Math.floor(date.getDate() / 7) + 1;
  var dayOfWeek = date.getDay();
  var day = days[dayOfWeek];
  if (day === '') return false;
  return availability['week'+weekOfMonth][day];
}

function listGoodDays(year, month) {
  var lastDay = new Date(new Date(year, month, 1)-1).getDate();
  return listOfdays[lastDay]
           .filter((d) => (isAGoodDay(new Date(year, month-1, d))))
           .map((d) => (new Date(year, month-1, d)));
}


const availability = {
        week1: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week2: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week3: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week4: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        },
        week5: {
            mon: false,
            tue: true,
            wed: true,
            thu: true,
            fri: false,
        }
    };


var days = ['','mon','tue','wed','thu','fri',''];
var listOfdays = 
  {"28" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]
,"29" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
,"30" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
,"31" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
  };


console.log( listGoodDays(2018, 11) );
0 голосов
/ 08 ноября 2018

Если мы предполагаем, что мы начинаем с первого понедельника месяца, то вы можете разбить месяц на недели и использовать availability для их отображения. Я использую официальный плагин moment-range , но вы можете рассчитать эти диапазоны другими способами:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const availability = { week1: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week2: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week3: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week4: { mon: false, tue: true, wed: true, thu: true, fri: false, }, };

const calcDays = (data, days) => {
  // get the assumed first Monday of the current month
  let fM = moment().startOf('month').isoWeekday('Monday')
  let cM = moment().month()

  // get the actual first Monday
  fM = fM.month() < cM ? fM.add(1, 'week').isoWeekday('Monday') : fM.month() > cM ? fM.subtract(1, 'week').isoWeekday('Monday') : fM

  // Calc the range based on first Monday and end of month
  const range = moment.range(fM, moment().endOf('month'));
  // Break into weeks
  const weeks = [...Array.from(range.by('week')), moment().endOf('month')]

  return Object.values(availability).reduce((r,c,i) => {
    var weekRanges = Array.from(moment.range(weeks[i], weeks[i + 1]).by('day'))
    Object.entries(c).map(([k, v], j) => v ? r.push(weekRanges[j].format()) : v)
    return r
  }, [])
}

console.log(calcDays(availability))

Выходы ( работали 8 ноября 2018 ):

[ '2018-11-06T00:00:00+00:00',
  '2018-11-07T00:00:00+00:00',
  '2018-11-08T00:00:00+00:00',
  '2018-11-13T00:00:00+00:00',
  '2018-11-14T00:00:00+00:00',
  '2018-11-15T00:00:00+00:00',
  '2018-11-20T00:00:00+00:00',
  '2018-11-21T00:00:00+00:00',
  '2018-11-22T00:00:00+00:00',
  '2018-11-27T00:00:00+00:00',
  '2018-11-28T00:00:00+00:00',
  '2018-11-29T00:00:00+00:00' ]

Вы можете видеть это здесь работает

...