Группировать и выравнивать массив объектов в соответствии с желаемым форматом - PullRequest
0 голосов
/ 27 июня 2019

У меня есть массив объектов, таких как:

{
 { HRProfile: 'Officer1', country: 'DEU', qty: 1 },
 { HRProfile: 'Officer1', country: 'AUT', qty: 3 },
 { HRProfile: 'Officer2', country: 'CZE', qty: 1 },
 { HRProfile: 'Officer3', country: 'DEU', qty: 1 },
 { HRProfile: 'Officer2', country: 'AUT', qty: 4 },
 { HRProfile: 'Officer1', country: 'CZE', qty: 1 },
}

Я хочу представить данные следующим образом:

Profile name | AUT| CZE| DEU | .... | Total
-------------------------------------------
Officer1     | 3  |  1 | 1   | ...  | 5
Officer2     | 4  |  1 | 0   | ...  | 5
Officer3     | 0  |  0 | 1   | ...  | 1

(значения ниже взяты из 'qty'поле)

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

'Officer1':
{
 'DEU':
  {
  { HRProfile: 'Officer1', country: 'DEU', qty: 1 },
  ...
  },
  'AUT':
  {
  ...
  }
},
'Officer2':
{
...
}

Но мне все еще нужно сгладить это определенным образом, чтобы достичьагрегаты для конкретных стран.Любая помощь с этим?Или, возможно, есть лучший подход для обработки этого?

1 Ответ

2 голосов
/ 27 июня 2019

Требуемый формат вывода для меня все еще довольно расплывчатый, хотя приведенный ниже код должен дать вам табличное представление, которое вы ищете.

Ниже код будет сначала сгруппирован по HRProfile и получит всезаписи стран для последующего создания массива объектов, где у каждого объекта есть требуемый ключ страны, общее значение и 0 значение по умолчанию для отсутствующих стран.

Хотя это странный формат вывода.

const sampleData = [
 { HRProfile: 'Officer1', country: 'DEU', qty: 1 },
 { HRProfile: 'Officer1', country: 'AUT', qty: 3 },
 { HRProfile: 'Officer2', country: 'CZE', qty: 1 },
 { HRProfile: 'Officer3', country: 'DEU', qty: 1 },
 { HRProfile: 'Officer2', country: 'AUT', qty: 4 },
 { HRProfile: 'Officer1', country: 'CZE', qty: 1 },
];

let countries = {};
const grouped = sampleData.reduce((acc, next) => {
  acc[next.HRProfile] = acc[next.HRProfile] || {};
  acc[next.HRProfile][next.country] = next.qty;
  // Keep track of all the countries.
  countries[next.country] = 0;
  acc[next.HRProfile].total = (acc[next.HRProfile].total || 0) + next.qty;
  return acc;
}, {});

const tableLike = Object.entries(grouped).map(([HRProfile, data]) => {
  return Object.assign({HRProfile}, countries, data);
});

console.log(grouped);
console.log(tableLike);
...