Как сгруппировать данные на основе сервера и получить последние данные - PullRequest
0 голосов
/ 14 января 2020

вот код:

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

Что я хочу сделать, это сгруппировать данные на основе сервера, который является «Сервер 1», и тогда он получит самые последние данные. это зависит от того, будет ли оно основано на дате, которая будет dateStart и dateEnd.

должна быть такой:

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

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Используйте метод reduce и объедините с Object.values. Ниже приведен пример кода в одну строку.

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);
1 голос
/ 14 января 2020

Я немного упростил ваш возвращаемый объект, поэтому свойства верхнего уровня - это просто server и data, а server удаляется из объектов второго уровня.

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)
1 голос
/ 14 января 2020

Вы можете использовать loda sh для вашего случая использования, вы можете просто сделать

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

Где serverData будет результатом, который вы ищете, rawData будет вашими начальными данными и dataObj будет отдельным объектом внутри rawData.

. Вы также можете перейти по этой ссылке для получения дополнительной информации о методе groupBy. Вот документация в loda sh для вышеуказанного метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...