Reputation: 211
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
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
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