JSFiddle - React, Tailwind, and code Playground

by Mike McCaughan

HTML

<script src="https://raw.github.com/timrwood/moment/1.7.2/min/moment.min.js"></script>
<ul id="weeks"></ul>

JavaScript

function populateWeeks(currentDay, firstSunday, lastSaturday) {
    var hz = moment.duration(lastSaturday.valueOf() - firstSunday.valueOf()).asHours(),
        hours = [], hh = 0, h, hd, hourMoment,
        year, month, day, dow, hour,
        days = [], dd = 0, d, dw, lastDay,
        weeks = [], ww = 0, w;
    for (; hh < hz; hh++) {
        hourMoment = moment(firstSunday).startOf('day').add('hours', hh);
        year = hourMoment.year();
        month = hourMoment.month();
        dow = hourMoment.day();
        day = hourMoment.date();
        hour = hourMoment.hour();
        h = {
            index: hh,
            year: year,
            month: month,
            dow: dow,
            day: day,
            hour: hour
        };
        if (lastDay !== day) {
            lastDay = day;
            if (hh !== 0) {
                hd = dd * 24;
                d = {
                    index: dd,
                    year: year,
                    month: month,
                    dow: dow,
                    day: day,
                    hours: hours.slice(hd, hd + 24)
                };
                days.push(d);
            }
        }
        if (dow === 6) {
            dw = ww * 7;
            w = {
                index: ww,
                days: days.slice(dw, dw + 7);
            };
            weeks.push(w);
        }
        
        hours.push(h);
    }
    
    return {
        weeks: weeks,
        hours: hours,
        days: days
    };
}

var view = 'week',
    currentDay = moment(),
    firstSunday = view === 'week' ? moment().day(0) : moment().startOf('month').day(0),
        lastSaturday = view === 'week' ? moment().day(6) : moment().endOf('month').day(6),
            populated = populateWeeks(currentDay, firstSunday, lastSaturday);

console && console.log(populated);