0

I am trying to create new arrays of objects from an array of objects called data, based on one of their values.

Each object is an event and has a startDateTime and an endDateTime value which is a string in the format of:

"startDateTime": "2022-10-28T21:01:11"

And

"endDateTime": "2022-10-29T21:01:11"

What I want is then is three arrays:

  • One with events that have passed. I was thinking with endDateTime before current day and time.
  • A second array with events that are currently ongoing. Where endDateTime is after current day and time.
  • And lastly a third array with events that have not yet started. Where startDateTime is after current day and time.

I have tried the following:

In order to get current day and time I used this:

var date = new Date();
var dateString =
    date.getUTCFullYear() + "-" +
    ("0" + (date.getUTCMonth()+1)).slice(-2) + "-" +
    ("0" + date.getUTCDate()).slice(-2) + "T" +
    ("0" + date.getUTCHours()).slice(-2) + ":" +
    ("0" + date.getUTCMinutes()).slice(-2) + ":" +
    ("0" + date.getUTCSeconds()).slice(-2);

console.log(dateString)
// 2022-10-28T09:00:00

The original array looks somewhat like this but with many other events:

const data = [
               {
                "name": "Dinner",
                "numOfAttending": 4,
                "startDateTime": "2018-04-28T19:00:00",
                "endDateTime": "2018-04-28T22:00:00"
               },
               {
                "name": "Studying",
                "numOfAttending": 1,
                "startDateTime": "2020-09-01T09:00:00",
                "endDateTime": "2023-06-10T15:00:00"
               },
               {
                "name": "Graduating!",
                "numOfAttending": 25,
                "startDateTime": "2023-06-11T09:00:00",
                "endDateTime": "2023-06-11T12:00:00"
               }
             ]

Then I made three empty arrays to populate:

  const eventsDone = [];       // This one should have the past dinner event in it.
  const eventsOngoing = [];    // This one should have current studying event in it.
  const eventsUpcoming = [];   // And this one should have the upcoming graduating event in it.

I have been trying to do this with a for loop, looping through the original array and if the conditions are met they will be pushed to respective array:

for (let i = 0; i < data.length; i++) {
    if (data[i].endDateTime < dateString) {
       eventsDone.push(data[i]);
    } 
    else if (data[i].endDateTime > dateString) {
       eventsOngoing.push(data[i]);
    }
    else if (data[i].startDateTime > dateString) {
       eventsUpcoming.push(data[i]);
    }
  }

But with no luck.

Thanks in advance!

1
  • 1
    btw, you could have used date.toISOString() for a faster formatting of date to string Commented Oct 28, 2022 at 22:16

1 Answer 1

0

This seems more precise to. First checking past, then future (you got that right). All the rest is ongoing.

const data = [{
    "name": "Dinner",
    "numOfAttending": 4,
    "startDateTime": "2018-04-28T19:00:00",
    "endDateTime": "2018-04-28T22:00:00"
  },
  {
    "name": "Studying",
    "numOfAttending": 1,
    "startDateTime": "2020-09-01T09:00:00",
    "endDateTime": "2023-06-10T15:00:00"
  },
  {
    "name": "Graduating!",
    "numOfAttending": 25,
    "startDateTime": "2023-06-11T09:00:00",
    "endDateTime": "2023-06-11T12:00:00"
  }
]

const eventsDone = []; // This one should have the past dinner event in it.
const eventsOngoing = []; // This one should have current studying event in it.
const eventsUpcoming = [];

var dateString = (new Date()).toISOString();
for (let i = 0; i < data.length; i++) {
  if (data[i].endDateTime < dateString) {
    eventsDone.push(data[i]);
  } else if (data[i].startDateTime > dateString) {
    eventsUpcoming.push(data[i]);
  } else {
    eventsOngoing.push(data[i]);
  }
}

console.log(eventsDone)
console.log(eventsOngoing)
console.log(eventsUpcoming)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.