1

i have list of objs:

[{
   name: one,
   date: 2017-09-18
}, {
   name: two,
   date: 2017-09-11
}, {
   name: three,
   date: 2017-09-13
}]

And i want to sort it by week. Maybe like:

{
1week(or , maybe better key like start of week): [{
       name: two,
       date: 2017-09-11
    }, {
       name: three,
       date: 2017-09-13
    ],
2week: [{
       name: one,
       date: 2017-09-18
    }]
}

how can I determine by what week the dates belong? how can I do better?

Lola
  • 2,591
  • 6
  • 24
  • 49
  • 1
    You should look momentjs. https://momentjs.com/docs/#/get-set/week/ First find out the week number and then sort. – Thusitha Sep 18 '17 at 15:16
  • Your "list of objs" is invalid. Also, it seems that you are still unsure as to what output you would like (also invalid). It would make for a better question (and answer) if you could validate the JavaScript and confirm what the desired output is. – Matthew Cawley Sep 18 '17 at 15:37

1 Answers1

1

I played around with this, and I think this is similar to what you need:

https://jsfiddle.net/pegla/ytmayemr/

code:

let arrayOfDates = [{
   name: 'one',
   date: '2017-09-18'
}, {
   name: 'two',
   date: '2017-09-11'
}, {
   name: 'three',
   date: '2017-09-13'
}];

function getWeekNumber(d) {
    // Copy date so don't modify original
    d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
    // Set to nearest Thursday: current date + 4 - current day number
    // Make Sunday's day number 7
    d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
    // Get first day of year
    var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
    // Calculate full weeks to nearest Thursday
    var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
    // Return array of year and week number
    return [d.getUTCFullYear(), weekNo];
}

let newArrayOfDatesByWeek = arrayOfDates.reduce((prevVal, currVal, index)=>{
    let week = `week ${getWeekNumber(new Date(currVal.date))[1]} of ${getWeekNumber(new Date(currVal.date))[0]}`;
  if(!(week in prevVal)) {
    prevVal[week] = []; 
  }
  prevVal[week].push(currVal);
  return prevVal;
}, []);

console.log(newArrayOfDatesByWeek);

getWeekNumber function is taken from this answer by RobG, so thanks for that: Get week of year in JavaScript like in PHP

pegla
  • 1,866
  • 4
  • 17
  • 20
  • The line that copies d is broken, and will subtract one day if you're in a timezone West of Greenwich. Use `d = new Date(d.getTime)` instead. – bbsimonbb Aug 08 '22 at 16:32