我正在尝试将数组之一转换为某种格式,以便可以将其自身转换为表格格式。
我有一个数组:
[
{
id: 1,
Revenue_Account: "Revenue Receipt",
Amount: 59567,
Year: "2012-13",
created_at: "2018-08-21T06:30:17.000Z",
updated_at: "2018-08-21T06:30:17.000Z"
},
{
id: 2,
Revenue_Account: "Revenue Expenditure ",
Amount: 54466,
Year: "2012-13",
created_at: "2018-08-21T06:30:17.000Z",
updated_at: "2018-08-21T06:30:17.000Z"
},
...
]
数组link to my actual array的完整代码
我希望将此数据转换为以下格式:
data: [
{
id: 1,
Sector: "Revenue Receipt",
2012-13: 59567,
2013-14: 68919,
2014-15: 72570,
2015-16: 96123,
2016-17: 105585,
2017-18_BE: 137158,
},
{
id: 2,
Sector: "Revenue Expenditure",
2012-13: 59567,
2013-14: 68919,
2014-15: 72570,
2015-16: 96123,
2016-17: 105585,
2017-18_BE: 137158,
},
....
]
我正在使用以下代码对数组进行分组:
group = b.group_by{|data| data[:Revenue_Account]}
这是按照我的期望对数据进行分组,以便实现我正在尝试的代码。
group = b.group_by{|data| data[:Revenue_Account]}
du = []
group.each do |i|
du.push({Sector:i[0]})
end
这为我提供了部门明智的结果,如何在代码中添加年份。
答案 0 :(得分:2)
您无法在其中拥有一个ID,因为您要对许多具有不同ID的条目进行分组,但这就是您如何以所需的格式获取数组的方法:
grouped = {}
b.each do |x|
grouped[x[:Revenue_Account]] ||= {}
grouped[x[:Revenue_Account]][:Sector] = x[:Revenue_Account]
grouped[x[:Revenue_Account]][x[:Year]] = x[:Amount]
end
return {data: grouped.values}
哪个可以让您:
{
:data=>[
{
:Sector=>"Revenue Receipt",
"2012-13"=>59567,
"2013-14"=>68919,
"2014-15"=>78417,
"2015-16"=>96123,
"2016-17"=>105585,
"2017-18_BE"=>137158
},
{
:Sector=>"Revenue Expenditure ",
"2012-13"=>54466,
"2013-14"=>62477,
"2014-15"=>72570,
"2015-16"=>83616,
"2016-17"=>94765,
"2017-18_BE"=>122603
},
]
}
我们通过遍历原始哈希并创建哈希密钥(如果哈希密钥不存在)来构建新哈希。然后,我们开始根据需要在输出中分配值。在每次迭代中,如果是第一次看到,我们都会在此哈希中为Revenue_Account值创建一个新键。然后,我们将特定的Revenue_Account的日期和金额分配给输出。因此,对于“收入收据”而言,它看起来像这样:
答案 1 :(得分:1)
另一个选择,直接操作数组。
array_of_data = array
.each { |h| h[:Sector] = h.delete(:Revenue_Account) }
.each { |h| h[h[:Year]] = h[:Amount]}
.each { |h| h.delete_if{ |k, _| k == :created_at || k == :updated_at || k == :id || k == :Year || k == :Amount} }
.group_by { |h| h[:Sector] }
.values.map { |a| a.inject(:merge) }
然后:
h = {}
h[:data] = array_of_data
要了解代码中会发生什么,只需逐行输出结果即可,例如:
p array
.each { |h| h[:Sector] = h.delete(:Revenue_Account) }
然后:
p array
.each { |h| h[:Sector] = h.delete(:Revenue_Account) }
.each { |h| h[h[:Year]] = h[:Amount]}
Etcetera ...
要了解.inject(:merge)
,请在此处Rails mapping array of hashes onto single hash