2

I am trying to use the group by function on a JSON array using the inner JSON value as a key as shown below. But unable to read the inner JSON value. Here is my JSON array.

NotificationData = [ 
   { 
      "eventId":"90989",
      "eventTime":"2019-12-11T11:20:53+04:00",
      "eventType":"yyyy",
      "event":{ 
         "ServiceOrder":{ 
            "externalId":"2434",
            "priority":"1"
         }
      }
   },
   { 
      "eventId":"6576",
      "eventTime":"2019-12-11T11:20:53+04:00",
      "eventType":"yyyy",
      "event":{ 
         "ServiceOrder":{ 
            "externalId":"78657",
            "priority":"1"
         }
      }
   }
]

GroupBy Logic:

const groupBy = (array, key) => {
  return array.reduce((result, currentValue) => {
    (result[currentValue[key]] = result[currentValue[key]] || []).push(
      currentValue
    );
    return result;
  }, {});
};

const serviceOrdersGroupedByExternalId = groupBy(this.NotificationData, 'event.ServiceOrder.externalId');
                                 //this line of code is not working as
                             // it is unable to locate the external id value.

Desired output

{ "2434":[{
     "eventId":"90989",
     "eventTime":"2019-12-11T11:20:53+04:00",
     "eventType":"yyyy",
     "event":{
        "ServiceOrder":{ "priority":"1" }
     } 
  }],
  "78657":[{
     "eventId":"6576",
     "eventTime":"2019-12-11T11:20:53+04:00",
     "eventType":"yyyy", 
     "event":{
        "ServiceOrder":{ "priority":"1" }
     }
  }]
}  
georgeawg
  • 48,608
  • 13
  • 72
  • 95
  • can you tell the desired output? – Mridul Dec 19 '19 at 05:23
  • { "2434":[ { "eventId":"90989", "eventTime":"2019-12-11T11:20:53+04:00", "eventType":"yyyy", "event":{ "ServiceOrder":{ "priority":"1" } } }], "78657":[ { "eventId":"6576", "eventTime":"2019-12-11T11:20:53+04:00", "eventType":"yyyy", "event":{ "ServiceOrder":{ "priority":"1" } } }] } – Sneha Aitha Dec 19 '19 at 05:50

2 Answers2

1

Does this solves your purpose?

let group = NotificationData.reduce((r, a) => {
  let d = r[a.event.ServiceOrder.externalId] = [...r[a.event.ServiceOrder.externalId] || [], a];
  return r;
 }, {});
 console.log(group);
Mridul
  • 1,320
  • 1
  • 5
  • 19
  • Thank you so much. It works as expected. Could you please brief me about the code since I am a beginner? – Sneha Aitha Dec 19 '19 at 06:26
  • You are welcome. For better understanding please visit here https://www.consolelog.io/group-by-in-javascript/ – Mridul Dec 19 '19 at 06:35
1

Try like this:

result = {};

constructor() {
  let externalIds = this.NotificationData.flatMap(item => item.event.ServiceOrder.externalId);

  externalIds.forEach(id => {
      var eventData = this.NotificationData.filter(
        x => x.event.ServiceOrder.externalId == id
      ).map(function(item) {
        delete item.event.ServiceOrder.externalId;
        return item;
      });
      this.result[id] = eventData;
  });
}

Working Demo

Adrita Sharma
  • 21,581
  • 10
  • 69
  • 79