-1

I have JSON like this:

[
  {
    "id": 9,
    "job_id": 302,
    "user_id": 63,
    "message": "User message 1",
    "created_at": 1584091342
  },
  {
    "id": 10,
    "job_id": 302,
    "user_id": 63,
    "message": "User message 2",
    "created_at": 1584095994
  },
  {
    "id": 14,
    "job_id": 302,
    "user_id": 63,
    "message": "Hello",
    "created_at": 1584102257
  },
]

How to group messages by date, something like this? (I'm using moment.js to format unix timestamp)

enter image description here

Armin Dervić
  • 165
  • 2
  • 11

1 Answers1

2

We can use the array function reduce for this:

We just also need to turn your data in milliseconds to days.

const data = [
  {
    "id": 9,
    "job_id": 302,
    "user_id": 63,
    "message": "User message 1",
    "created_at": 1584130559280
  },
  {
    "id": 10,
    "job_id": 302,
    "user_id": 63,
    "message": "User message 2",
    "created_at": 1584130559280
  },
  {
    "id": 14,
    "job_id": 302,
    "user_id": 63,
    "message": "Hello",
    "created_at": 1584216959280
  },
  {
    "id": 15,
    "job_id": 302,
    "user_id": 63,
    "message": "World",
    "created_at": 1584216959280
  }  
]

const groupedData = data.reduce((aggObj, child) => {
  const myDate = new Date(child.created_at);
  //console.log(myDate.toDateString());
  //console.log(myDate.getTime());
  if (aggObj.hasOwnProperty(myDate.toDateString())){
    aggObj[myDate.toDateString()].push(child);
  } else {
    aggObj[myDate.toDateString()] = [child];
  }    
  return aggObj
}, {})

console.log(groupedData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

I changed the created_at values so the first two messages are from yesterday and the last two from today.

The output is:

{
  "Fri Mar 13 2020": [
    {
      "id": 9,
      "job_id": 302,
      "user_id": 63,
      "message": "User message 1",
      "created_at": 1584130559280
    },
    {
      "id": 10,
      "job_id": 302,
      "user_id": 63,
      "message": "User message 2",
      "created_at": 1584130559280
    }
  ],
  "Sat Mar 14 2020": [
    {
      "id": 14,
      "job_id": 302,
      "user_id": 63,
      "message": "Hello",
      "created_at": 1584216959280
    },
    {
      "id": 15,
      "job_id": 302,
      "user_id": 63,
      "message": "World",
      "created_at": 1584216959280
    }
  ]
}
Alex L
  • 4,168
  • 1
  • 9
  • 24