2 Вопрос: Объединить и агрегировать данные объекта json с помощью node.js

вопрос создан в Wed, May 8, 2019 12:00 AM

Я генерирую следующий json в своем приложении Node:

    [ { id: 1,
        name: 'user1',
        sport: 'athletics',
        medal_count: '1' 
      },
      { id: 1,
        name: 'user1',
        sport: 'tennis',
        medal_count: '2' 
      },
      { id: 2,
        name: 'user2',
        sport: ['football'],
        medal_count: '2' 
      }
    ]

Теперь я хотел бы объединить пользователей, чтобы они отображались как один объект с sport, указанным в массиве, и medal_count, агрегированных для пользователя. Вышеупомянутый JSON будет выглядеть следующим образом:

    [ { id: 1,
        name: 'user1',
        sport: [
          'athletics',
          'tennis'
        ],
        medal_count: '3' 
      },
      { id: 2,
        name: 'user2',
        sport: 'football',
        medal_count: '2' 
      }
    ]

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

    
0
2 ответа                              2                         

Да, вы правы:

р>

'use strict';

const data = [{
  id: 1,
  name: 'user1',
  sport: 'athletics',
  medal_count: '1',
},
{
  id: 1,
  name: 'user1',
  sport: 'tennis',
  medal_count: '2',
},
{
  id: 2,
  name: 'user2',
  sport: 'football',
  medal_count: '2',
}];


const out = data.reduce((accumulator, item) => {
  if (accumulator[item.id]) {
    const group = accumulator[item.id];
    if (Array.isArray(group.sport)) {
      group.sport.push(item.sport);
    } else {
      group.sport = [group.sport, item.sport];
    }
    group.medal_count = `${(+group.medal_count) + (+item.medal_count)}`;
  } else {
    accumulator[item.id] = item;
  }
  return accumulator;
}, {});

console.log(JSON.stringify(out, null, 2));

Обратите внимание, что вы используете числа в качестве строк для medal_count

    
1
2019-05-08 15: 58: 43Z
  1. Спасибо. Как убедиться, что все объекты sport являются массивами, а не только объектами с более чем одним видом спорта?
    2019-05-08 19: 23: 59Z
  2. Я отредактировал пример кода, чтобы убедиться, что все спортивные объекты являются массивами, даже если они содержат только одно значение. В противном случае, спасибо за помощь.
    2019-05-09 06: 24: 32Z
  3. Да, в этом случае if(Array.isArray больше не требуется
    2019-05-09 07: 09: 18Z
  4. Ах, да. Я вижу, что это работает: `` `const out = data.reduce ((аккумулятор, элемент) = > {if (аккумулятор [item.id]) {const group = аккумулятор [item.id]; group.sport.push ( item.sport); group.medal_count = ${(+ group.medal_count) + (+ item.medal_count)};} else {аккумулятор [item.id] = item; item.sport = [item.sport]} аккумулятор возврата ;}, {}); console.log (JSON.stringify (out, null, 2)); `` `
    2019-05-09 07: 15: 50Z

Отредактированный

let input = [{
  id: 1,
  name: 'user1',
  sport: 'athletics',
  medal_count: '1'
},
  {
    id: 1,
    name: 'user1',
    sport: 'tennis',
    medal_count: '2'
  },
  {
    id: 2,
    name: 'user2',
    sport: 'football',
    medal_count: '2'
  }
];

let grouped = {};
input.forEach(({id, name, sport, medal_count}) => {
  grouped[id] = grouped[id] || {id, name, sport: [], medal_count:0};
  if (!grouped[id].sport.includes(sport))
    grouped[id].sport.push(sport);
  grouped[id].medal_count = `${(+grouped[id].medal_count)+ (+medal_count)}`;
});
grouped = Object.values(grouped);

console.log(grouped);
    
2
2019-05-08 16: 49: 07Z
источник размещен Вот