0

here's the code:

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"
            }
}

What I want to do is group the data based on the server which is the "Server 1" and then it will get the latest data. it depends if it will be based on the date which is the dateStart and dateEnd.

output should be like this:

[
    {
        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"
        data: [
        {
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        },{
            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"
        data: [
        {
            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"
            },
            {
            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"
            }
        ]
    }
]

Thanks in advance

ABC
  • 752
  • 4
  • 17
  • 40
  • 2
    What you tried? – PrakashT Jan 14 '20 at 04:46
  • Why are you repeating all of the properties of the first object in each server array? Why not just have server and data as the top-level properties? – symlink Jan 14 '20 at 04:52
  • Does this answer your question? [Most efficient method to groupby on an array of objects](https://stackoverflow.com/questions/14446511/most-efficient-method-to-groupby-on-an-array-of-objects) – Kaushik Jan 14 '20 at 05:10
  • @symlink because sir, I will apply it in master detail – ABC Jan 14 '20 at 05:15

3 Answers3

2

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) => 
     (new Date(a.dateStart).getTime()) - 
       (new Date(b.dateStart).getTime())).reduce((acc, curr) => {
    const { server, ...rest_curr } = curr;
    return {
      ...acc,
      [curr.server]:
        curr.server in acc
          ? {
              ...acc[curr.server],
              data: [...acc[curr.server].data, { ...rest_curr }]
            }
          : { ...curr, data: [{ ...rest_curr }] }
    };
  }, {})
);

console.log(res);
Siva K V
  • 10,561
  • 2
  • 16
  • 29
  • How to remove the server inside the parent – ABC Jan 14 '20 at 05:33
  • @ABC, Just updated the answer. Basically go thru items after process and remove the property. (Alternatively you can also use `Reflect.deleteProperty` in map method). – Siva K V Jan 14 '20 at 05:46
  • Sir siva not the parent server. the child property. ```{server: "Server 1", ...etc., data: [ { ping, dl, ul, ispcon, dateStart, dateEnd}]}``` – ABC Jan 14 '20 at 05:51
  • ```Property 'server' does not exist on type '{}'``` there's an error – ABC Jan 14 '20 at 05:57
  • Sorry @ABC, my bad, Now updated the answer to remove the `server` from data array. Check this. – Siva K V Jan 14 '20 at 06:19
  • How to Sort the data based on the date – ABC Jan 20 '20 at 02:06
  • @ABC, Sample sort can do is like `rowData.sort((a, b) => (new Date(a.dateStart).getTime()) - (new Date(b.dateStart).getTime()))`, This will be sort based on dateStart. Updated the answer. Please change it accordingly to your needs. – Siva K V Jan 20 '20 at 04:52
1

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.

shivamragnar
  • 383
  • 2
  • 10
1

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.server
        delete cur.server
        return acc.concat({server: server, data: [cur]})
    }
    
},[])

console.log(res)
symlink
  • 11,984
  • 7
  • 29
  • 50