首页 > 解决方案 > Ruby on Rails - Ruby,如何使用相同的键从两个哈希中添加值,而不覆盖这些值?

问题描述

首先感谢您在这一点上帮助我解决我的 SQL 问题。

现在我正在为另一件事而苦苦挣扎,这让我想,说实话,我是否应该放弃成为一名程序员。

无论如何,我的问题是:我有一个哈希数组(并且在该哈希内还有另一个),如下所示:

[
 {"A1"=>{:month=>1.0, :balance=>"0.0000", :price=>"9.0000"}}, 
 {"A1"=>{:month=>7.0, :balance=>"34030.0000", :price=>"34030.0000"}},
 {"A3"=>{:month=>4.0, :balance=>"34030.0000", :price=>"34030.0000"}},
 ...
]

我想要完成的是,如果有两个值具有相同的键,即“A1”,则将这些值添加到一个完整的哈希中,而不覆盖旧值并将月份作为所需的键输出:

[
 {"A1"=> { 1 => { :balance=> "0.0000", :price=>"9.0000"} },
         { 7 => { :balance => "34030.0000", :price => "34030.0000" } }},
  and so on... 
]

这可能吗?

标签: arraysruby-on-railsrubyhash

解决方案


由于您拥有的数据的当前格式,您将需要不止几个转换。它们中的大多数基于转换结果哈希的值,在通过它们唯一的键对数组中的哈希进行分组之后:

data
  .group_by { |hash| hash.keys.first }                                     # (1)
  .transform_values { |value| value.flat_map(&:values) }                   # (2)
  .transform_values { |values| values.index_by { |value| value[:month] } } # (3)

第一个转换是对当前对象进行分组,该对象包含一个哈希数组,通过其唯一的哈希键,因此keys.first,导致:

{
  "A1"=>[
    {"A1"=>{:month=>1.0, :balance=>"0.0000", :price=>"9.0000"}}, 
    {"A1"=>{:month=>7.0, :balance=>"34030.0000", :price=>"34030.0000"}}
  ],
  "A3"=>[{"A3"=>{:month=>4.0, :balance=>"34030.0000", :price=>"34030.0000"}}]
}

第二,是从每个散列中只提取值,在结果散列中,带有散列数组:

{
  "A1"=>[
    {:month=>1.0, :balance=>"0.0000", :price=>"9.0000"}, 
    {:month=>7.0, :balance=>"34030.0000", :price=>"34030.0000"}
  ],
  "A3"=>[{:month=>4.0, :balance=>"34030.0000", :price=>"34030.0000"}]
}

然后,它只是缺少将散列数组转换为简单的散列,其键是 的值month

{
  "A1"=>{
    1.0=>{:month=>1.0, :balance=>"0.0000", :price=>"9.0000"}, 
    7.0=>{:month=>7.0, :balance=>"34030.0000", :price=>"34030.0000"}
  },
  "A3"=>{4.0=>{:month=>4.0, :balance=>"34030.0000", :price=>"34030.0000"}}
}

推荐阅读