Rail将数组转换为组

时间:2018-08-24 14:42:07

标签: ruby-on-rails arrays

我正在尝试将数组之一转换为某种格式,以便可以将其自身转换为表格格式。

我有一个数组:

  [
    {
    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

这为我提供了部门明智的结果,如何在代码中添加年份。

2 个答案:

答案 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的日期和金额分配给输出。因此,对于“收入收据”而言,它看起来像这样:

  • 分组哈希开始为空
  • 在第一次迭代中,我们看到group [“ Revenue Receipt”]为nil,因此我们通过|| =(如果为nil,则赋值为空)来将其初始化为空散列
  • 然后我们分配:Sector =>“收入收据”,然后输入该条目的“年份和金额”,“ 2012-13” => 59567
  • 我们分组的哈希看起来像:{“收据” => {:Sector =>“收据”,“ 2012-13” => 59567}
  • 在下一次迭代中,我们看到group [“ Revenue Receipt”]不是nil,所以|| =不会用空哈希值覆盖它
  • 然后,我们分配:Sector =>“ Revenue Receipt”和该条目的Year and Amount,“ 2012-14” => 68919,它将为现有的哈希添加新的键/值
  • 我们的分组哈希现在看起来像:{“收据” => {:Sector =>“收据”,“ 2012-13” => 59567,“ 2012-14” => 68919}
  • 解析完整个数组之后,我们现在有了一个哈希,该哈希具有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