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"