Javascript 分组并展平对象数组以匹配所需格式

Javascript 分组并展平对象数组以匹配所需格式,javascript,arrays,group-by,Javascript,Arrays,Group By,我有一个这样的对象数组: { { 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', c

我有一个这样的对象数组:

{
 { 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
(以下值取自“数量”字段)

我可以使用HRProfile和country上的group by实现类似于以下内容的嵌套结构:

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

但我仍然必须以一种特定的方式将其扁平化,以实现特定国家的总量。有什么帮助吗?或者也许有更好的方法来处理这个问题?

我对所需的输出格式仍然很模糊,尽管下面的代码应该会给出您想要的类似表格的表示形式

下面的代码将首先按HRProfile进行分组,并将获取所有国家/地区条目,以便稍后创建一个对象数组,其中每个对象都有所需的国家/地区键、总值和缺少国家/地区的默认值

不过,这是一种奇怪的输出格式

const sampleData=[
{HRProfile:'Officer1',country:'DEU',数量:1},
{HRProfile:'Officer1',country:'AUT',数量:3},
{HRProfile:'Officer2',国家:'CZE',数量:1},
{HRProfile:'Officer3',country:'DEU',数量:1},
{HRProfile:'Officer2',country:'AUT',数量:4},
{HRProfile:'Officer1',国家:'CZE',数量:1},
];
让国家={};
const group=sampleData.reduce((acc,next)=>{
acc[next.HRProfile]=acc[next.HRProfile]|{};
acc[next.HRProfile][next.country]=next.qty;
//跟踪所有国家。
国家[下一个国家]=0;
acc[next.HRProfile].total=(acc[next.HRProfile].total | | 0)+next.qty;
返回acc;
}, {});
const tableLike=Object.entries(grouped.map)([HRProfile,data])=>{
返回Object.assign({HRProfile},国家,数据);
});
控制台日志(分组);

console.log(表状)所需的输出格式对我来说仍然很模糊,尽管下面的代码应该会给出您想要的类似表格的表示形式

下面的代码将首先按HRProfile进行分组,并将获取所有国家/地区条目,以便稍后创建一个对象数组,其中每个对象都有所需的国家/地区键、总值和缺少国家/地区的默认值

不过,这是一种奇怪的输出格式

const sampleData=[
{HRProfile:'Officer1',country:'DEU',数量:1},
{HRProfile:'Officer1',country:'AUT',数量:3},
{HRProfile:'Officer2',国家:'CZE',数量:1},
{HRProfile:'Officer3',country:'DEU',数量:1},
{HRProfile:'Officer2',country:'AUT',数量:4},
{HRProfile:'Officer1',国家:'CZE',数量:1},
];
让国家={};
const group=sampleData.reduce((acc,next)=>{
acc[next.HRProfile]=acc[next.HRProfile]|{};
acc[next.HRProfile][next.country]=next.qty;
//跟踪所有国家。
国家[下一个国家]=0;
acc[next.HRProfile].total=(acc[next.HRProfile].total | | 0)+next.qty;
返回acc;
}, {});
const tableLike=Object.entries(grouped.map)([HRProfile,data])=>{
返回Object.assign({HRProfile},国家,数据);
});
控制台日志(分组);


console.log(表状)一个简单的
映射
如何在每个对象上填充
countryName1
countryName2
?或是两个能手。输入格式似乎已经接近预期结果,我个人不会对任何内容进行分组。国家名称来自哪里?请同时添加所需的结果。所需的嵌套结构没有意义(即,它是一个损坏的表示)。路径
'63.'377'
处的值是多少?它不是对象,也不是数组。修复此问题以获得任何合理的答案。我已为示例添加了更多说明我已添加了更多说明简单的
map
如何在每个对象上填充
countryName1
countryName2
?或是两个能手。输入格式似乎已经接近预期结果,我个人不会对任何内容进行分组。国家名称来自哪里?请同时添加所需的结果。所需的嵌套结构没有意义(即,它是一个损坏的表示)。路径
'63.'377'
处的值是多少?它不是对象,也不是数组。解决这个问题可以得到任何合理的答案。我在示例中添加了更多的澄清。我添加了更多的澄清。这实际上正是我所需要的。我欠你一杯啤酒。@n0e谢谢,但不幸的是我不喝酒:P无论如何,我建议你重新考虑数据模型,这是一个相当昂贵且难以维持的程序,你应该考虑其他方法来详细说明你的输入,或使用其他方法来呈现值,否则,从长远来看,进一步细化数据时可能会遇到问题;)。我有一个问题,正如您在下面的示例中看到的,各个列的总和存在问题(total很好)。我很难弄清楚如何更改此代码。@n0e这是因为具有单个itemName的原始约束已被打破。假设只有一个itemName,则例程分配数量。要快速解决此问题,您只需增加该项的计数器值,特别是在再次遇到该项时,在此处使用fiddle:。这实际上正是我所需要的。我欠你一杯啤酒。@n0e谢谢,但不幸的是我不喝酒:P无论如何,我建议你重新考虑数据模型,这是一个相当昂贵且难以维持的程序,你应该考虑其他方法来详细说明你的输入,或使用其他方法来呈现值,否则,从长远来看,进一步细化数据时可能会遇到问题;)。我有一个问题,正如您在下面的示例中看到的,各个列的总和存在问题(total很好)。我很难弄清楚如何更改此代码。@n0e这是因为具有单个itemName的原始约束已被打破。假设只有一个itemName,则例程分配数量。