Как эффективно группировать объекты и производить расчеты для каждой группы объектов - PullRequest
3 голосов
/ 15 мая 2019

Я работаю над приложением javascript, где я получаю некоторые данные из API, вот как выглядят несколько записей набора данных:

    {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 
    05-2019 10:56:28", duration: "45.665", nodeId: "1", …}
    {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-                                        
    05-2019 10:56:28", duration: "47.602", nodeId: "9", …}
    {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 
    05-2019 10:56:28", duration: "5.287", nodeId: "12", …}
    {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 
    05-2019 10:56:28", duration: "5.932", nodeId: "27", …}
    {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 
    05-2019 10:56:28", duration: "56.918", nodeId: "9", …}

Как вы можете видеть, это набор объектовТеперь я хочу сгруппировать этот набор объектов по nodeId.Так что я могу делать расчеты для каждого nodeId.Я хочу, чтобы средняя продолжительность каждого nodeId.Но я не знаю, с чего начать / как сделать это эффективно.

Я думаю, что это должно быть с каким-то фильтром / картой / уменьшением, я прав?Пока еще не могу обернуть голову вокруг этого

Спасибо за привет

Ответы [ 3 ]

0 голосов
/ 15 мая 2019

используйте reduce для группировки по nodeId, а также создайте массив длительности.Затем вы можете использовать map, чтобы получить среднее значение вашей продолжительности

const input = [
{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "45.665", nodeId: "1"},
{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "47.602", nodeId: "9"},
{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 05-2019 10:56:28", duration: "5.287", nodeId: "12"},
{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 05-2019 10:56:28", duration: "5.932", nodeId: "27"},
{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 05-2019 10:56:28", duration: "56.918", nodeId: "9"}];

const groupByNodeId = Object.values(input.reduce((accu, {nodeId, duration, ...rest}) => {
    if(!accu[nodeId]) {
        accu[nodeId] = {...rest, nodeId, durations : []};
    } 
    // console.log(accu[nodeId]);
    accu[nodeId].durations.push(Number(duration));
    return accu;
}, {}));

const getSum = (arr) => arr.reduce((accu, num) => accu+num);
const output = groupByNodeId.map(({durations, ...rest}) => ({...rest, durationAvg: getSum(durations)/durations.length}));
console.log(output);
0 голосов
/ 15 мая 2019

Я считаю, что это то, что вы хотите - используйте reduce:

const data = [{eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "45.665", nodeId: "1"}, {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019-10:56:28", duration: "47.602", nodeId: "9"}, {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "5.287", nodeId: "12"}, {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15- 05-2019 10:56:28", duration: "5.932", nodeId: "27"}, {eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "56.918", nodeId: "9"}];

const res = data.reduce((acc, curr) => {
  acc[curr.nodeId] = acc[curr.nodeId] ? acc[curr.nodeId].concat(curr) : [curr];
  return acc;
}, {});

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
0 голосов
/ 15 мая 2019

Вы можете взять объект и сохранить сумму, количество и среднее для каждого nodeId.

var data = [{ eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "45.665", nodeId: "1" }, { eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "47.602", nodeId: "9" }, { eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "5.287", nodeId: "12" }, { eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10:56:28", duration: "5.932", nodeId: "27" }, { eventAction: "area", sessionId: "20190515|04434531", timestamp: "15-05-2019 10: 56: 28", duration: "56.918", nodeId: "9" }],
    result = data.reduce((r, { duration, nodeId }) => {
        r[nodeId] = r[nodeId] || { sum: 0, count: 0, average: 0 };
        r[nodeId].sum += +duration;
        r[nodeId].average = r[nodeId].sum / ++r[nodeId].count;
        return r;
    }, {});

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