LearningROR
LearningROR

Reputation: 211

How to populate weeks number based on date occurance in javascript

I have a data like below:

************************************************************************************************

                                                    May - 2020


                    Date                                          Week                 Week Count

Fri May 01 2020 00:00:00 GMT+0500 (Pakistan Standard Time)             18                   1   
Sat May 02 2020 00:00:00 GMT+0500 (Pakistan Standard Time)             18                   1   
Sun May 03 2020 00:00:00 GMT+0500 (Pakistan Standard Time)             18                   1+2 = 3  
Mon May 04 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Tue May 05 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Wed May 06 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Thu May 07 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Fri May 08 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Sat May 09 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1
Sun May 10 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              19                  1+6 = 7
Mon May 11 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Tue May 12 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Wed May 13 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Thu May 14 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Fri May 15 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Sat May 16 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1
Sun May 17 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              20                  1+6 = 7
Mon May 18 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Tue May 19 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Wed May 20 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Thu May 21 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Fri May 22 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Sat May 23 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1
Sun May 24 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              21                  1+6 = 7 
Mon May 25 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Tue May 26 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Wed May 27 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Thu May 28 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Fri May 29 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Sat May 30 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1
Sun May 31 2020 00:00:00 GMT+0500 (Pakistan Standard Time)              22                  1+6 = 7

***********************************************************************************************

And I like to arrange it like based on week occurances: So final result will be like:

18=>3, 19=>7, 20=> 7, 21=>7, 22=>7

So in May, 18th week occured 1 time but 3 dates were occupied in `18th week of may 2020. Similarly, same goes for other dates in stated above

The code I am trying is:

{
  daysNumber.map((number, index) => {
    let d = number.split('-');
    NDate = new Date(d[0], d[1] - 1, d[2]);
    weekNum = this.getWeekNumber(NDate);
  })
}

getWeekNumber(now) {
  let onejan = new Date(now.getFullYear(), 0, 1);
  return Math.ceil((((now - onejan) / 86400000) + onejan.getDay()) / 7);
}

getDaysNumber(year, month) {
        const dates = [];
        const daysInMonth = new Date(year, month, 0).getDate();
        for (let i = 1; i <= daysInMonth; i++) {
            let parts = new Date(year + "-" + month + "-" + i);
            dates.push(this.convertToDesiredDate(parts));
        }
        return dates;
    }

convertToDesiredDate(str) {
        let date = new Date(str),
            month = ("0" + (date.getMonth() + 1)).slice(-2),
            day = ("0" + date.getDate()).slice(-2);
        return [date.getFullYear(), month, day].join("-");
    }

Where daysNumber contains the month days starting from 01-31 ( for may ).

It will grow depends on the month.

I am stuck at populating them as an array to find how many times a week appeared in dates like my output.

Upvotes: 0

Views: 145

Answers (2)

mplungjan
mplungjan

Reputation: 177841

Here is a version using luxon

const DateTime = luxon.DateTime;    
const weekNums = days.reduce((obj, dateString) => {
  let d = DateTime.fromJSDate(new Date(dateString))
  const week = d.weekNumber;
  console.log(d,d.weekdayLong,week)
  obj[week] = (obj[week] + 1) || 1;
  return obj;
}, {})

const days = `Fri May 01 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 02 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 03 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 04 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 05 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 06 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 07 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 08 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 09 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 10 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 11 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 12 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 13 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 14 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 15 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 16 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 17 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 18 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 19 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 20 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 21 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 22 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 23 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 24 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 25 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 26 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 27 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 28 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 29 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 30 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 31 2020 00:00:00 GMT+0500 (Pakistan Standard Time)`.split("\n")

// https://moment.github.io/luxon/docs/manual/tour.html#parse-from-iso-8601
// https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html
const DateTime = luxon.DateTime;
const weekNums = days.reduce((obj, dateString) => {
  let d = DateTime.fromJSDate(new Date(dateString))
  const week = d.weekNumber;
  console.log(d,d.weekdayLong,week)
  obj[week] = (obj[week] + 1) || 1;
  return obj;
}, {})

console.log(weekNums)
<script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/1.24.1/luxon.min.js"></script>

Using moment

const weekNums = days.reduce((obj, dateString) => {
  let d = moment(dateString)
  const week = d.isoWeek();
  console.log(week,d.format('dddd'))
  obj[week] = (obj[week] + 1) || 1;
  return obj;
}, {})

const days = `Fri May 01 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 02 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 03 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 04 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 05 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 06 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 07 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 08 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 09 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 10 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 11 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 12 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 13 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 14 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 15 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 16 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 17 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 18 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 19 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 20 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 21 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 22 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 23 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 24 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 25 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 26 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 27 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 28 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 29 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 30 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 31 2020 00:00:00 GMT+0500 (Pakistan Standard Time)`.split("\n")

const weekNums = days.reduce((obj, dateString) => {
  let d = moment(dateString)
  const week = d.isoWeek();
  console.log(week,d.format('dddd'))
  obj[week] = (obj[week] + 1) || 1;
  return obj;
}, {})

console.log(weekNums)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/locale/de.min.js"></script>

OLD ANSWER:

Using the elegant reduce

const weekNums = days.reduce((obj,dateString) => {
  const week = getWeekNumber(new Date(dateString));
  obj[week] = (obj[week]+1) || 1;
  return obj; 
},{})

PS: Week numbers start on the week that has the first thursday in the year

const days = `Fri May 01 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 02 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 03 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 04 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 05 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 06 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 07 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 08 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 09 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 10 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 11 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 12 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 13 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 14 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 15 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 16 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 17 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 18 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 19 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 20 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 21 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 22 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 23 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 24 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Mon May 25 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Tue May 26 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Wed May 27 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Thu May 28 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Fri May 29 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sat May 30 2020 00:00:00 GMT+0500 (Pakistan Standard Time)
Sun May 31 2020 00:00:00 GMT+0500 (Pakistan Standard Time)`.split("\n")



const getWeekNumber = now => {
  let onejan = new Date(now.getFullYear(), 0, 1);
  return Math.ceil((((now - onejan) / 86400000) + onejan.getDay()) / 7);
}

const getDaysNumber = (year, month) => {
  const dates = [];
  const daysInMonth = new Date(year, month, 0).getDate();
  for (let i = 1; i <= daysInMonth; i++) {
    let parts = new Date(year + "-" + month + "-" + i);
    dates.push(this.convertToDesiredDate(parts));
  }
  return dates;
}

const weekNums = days.reduce((obj, dateString) => {
  const week = getWeekNumber(new Date(dateString));
  obj[week] = (obj[week] + 1) || 1;
  return obj;
}, {})

console.log(weekNums)

Upvotes: 2

Tomasz Bubała
Tomasz Bubała

Reputation: 2153

Your question is a bit messy, but I'll do my best. I used your implementation of getWeekNumber, provided my own dates and wrote a simple reduce. If there's no entry for a particular week, we add it with a count of one, otherwise we increment and that's it. Learn more about Array.prototype.reduce here.

const dates = [
  new Date('2000-01-01'),
  new Date('2000-01-25'),
  new Date('2000-02-01'),
  new Date('2000-02-02'),
  new Date('2000-02-03'),
];

const getWeekNumber = now => {
  let onejan = new Date(now.getFullYear(), 0, 1);
  return Math.ceil((((now - onejan) / 86400000) + onejan.getDay()) / 7);
}

const result = dates.reduce((countPerWeek, date) => {
  const weekNumber = getWeekNumber(date);

  if (!countPerWeek[weekNumber]) {
    countPerWeek[weekNumber] = 1;
  } else {
    countPerWeek[weekNumber]++;
  }
 
  return countPerWeek;
}, {});

console.log(result);

Upvotes: 2

Related Questions