Skip to content Skip to sidebar Skip to footer

How To Group The Data Based On Server And Get The Latest Data

here's the code: rowData = [ { server: 'Server 1', ping: '10 ms', dl: '50Mbit/s', ul: '50Mbit/s', ispcon: true,

Solution 1:

Use the reduce method and combine with Object.values. Below is sample code in one line.

const rowData = [
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 09:00:00",
    dateEnd: "2019-10-12 09:05:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 08:40:00",
    dateEnd: "2019-10-12 08:45:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 08:15:00",
    dateEnd: "2019-10-12 08:25:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 08:10:00",
    dateEnd: "2019-10-12 08:15:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 08:00:00",
    dateEnd: "2019-10-12 08:05:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 07:00:00",
    dateEnd: "2019-10-12 08:05:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 06:00:00",
    dateEnd: "2019-10-12 07:05:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 05:00:00",
    dateEnd: "2019-10-12 06:05:000"
  },
  {
    server: "Server 1",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 04:00:00",
    dateEnd: "2019-10-12 05:05:000"
  },

  {
    server: "Server 2",
    ping: "10 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 09:03:00",
    dateEnd: "2019-10-12 09:05:000"
  },
  {
    server: "Server 2",
    ping: "2 ms",
    dl: "50Mbit/s",
    ul: "50Mbit/s",
    ispcon: true,
    dateStart: "2019-10-12 09:00:00",
    dateEnd: "2019-10-12 09:01:000"
  }
];

const res = Object.values(
  rowData.sort((a, b) => 
     (newDate(a.dateStart).getTime()) - 
       (newDate(b.dateStart).getTime())).reduce((acc, curr) => {
    const { server, ...rest_curr } = curr;
    return {
      ...acc,
      [curr.server]:
        curr.serverin acc
          ? {
              ...acc[curr.server],
              data: [...acc[curr.server].data, { ...rest_curr }]
            }
          : { ...curr, data: [{ ...rest_curr }] }
    };
  }, {})
);

console.log(res);

Solution 2:

You can use lodash for your use case, you can simply do

let serverData = _.groupBy(rawData, dataObj => dataObj.server)

Where serverData would be the result you are looking for, rawData will be your initial data and dataObj will be the individual object inside the rawData.

You can also follow this link for more details on groupBy method. Here is the documentation in lodash for the above method.

Solution 3:

I simplified your returned object a bit, so the top level properties are just server and data, and server is removed from the second level objects.

let arr=rowData=[{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 09:00:00",dateEnd:"2019-10-12 09:05:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 08:40:00",dateEnd:"2019-10-12 08:45:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 08:15:00",dateEnd:"2019-10-12 08:25:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 08:10:00",dateEnd:"2019-10-12 08:15:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 08:00:00",dateEnd:"2019-10-12 08:05:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 07:00:00",dateEnd:"2019-10-12 08:05:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 06:00:00",dateEnd:"2019-10-12 07:05:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 05:00:00",dateEnd:"2019-10-12 06:05:000"},{server:"Server 1",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 04:00:00",dateEnd:"2019-10-12 05:05:000"},{server:"Server 2",ping:"10 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 09:03:00",dateEnd:"2019-10-12 09:05:000"},{server:"Server 2",ping:"2 ms",dl:"50Mbit/s",ul:"50Mbit/s",ispcon:!0,dateStart:"2019-10-12 09:00:00",dateEnd:"2019-10-12 09:01:000"}];

let res = rowData.reduce((acc,cur) => {
    if(acc.some(el => el.server && el.server === cur.server)){
        return acc.map(el => {
            if(el.server === cur.server){
                delete cur.server
                el.data.push(cur) 
            }            
            return el
        })
    }else{
        let server = cur.serverdelete cur.serverreturn acc.concat({server: server, data: [cur]})
    }
    
},[])

console.log(res)

Post a Comment for "How To Group The Data Based On Server And Get The Latest Data"