首页 > 解决方案 > Ruby Hash Group 按两个键

问题描述

我有一个看起来像这样的 Ruby 哈希 -

report = {
    "count_by_state"=>[
        {"day"=>"2021-02-23", "policy_state"=>2, "count"=>48},
        {"day"=>"2021-02-23", "policy_state"=>3, "count"=>5},
        {"day"=>"2021-02-23", "policy_state"=>4, "count"=>89},
        {"day"=>"2021-02-25", "policy_state"=>2, "count"=>1},
        {"day"=>"2021-02-25", "policy_state"=>3, "count"=>4},
        {"day"=>"2021-02-25", "policy_state"=>4, "count"=>90}
    ]
}

我试图得到一个看起来像这样的哈希

{2: {"2021-02-23" => 48,"2021-02-25" => 1},
3: {"2021-02-23" => 5,"2021-02-25" => 4},
4: {"2021-02-23" => 89,"2021-02-25" => 90}}

我已经尝试了很多东西,并且到目前为止已经使用了这段代码-

grouping = report['count_by_state'].group_by {|x| x['policy_state']}
puts grouping
puts grouping.map { |k,v| [ k => v.group_by {|x| x['day']} ] }

{2=>{"2021-02-23"=>[{"day"=>"2021-02-23", "policy_state"=>2, "count"=>48}], "2021-02-25"=>[{"day"=>"2021-02-25", "policy_state"=>2, "count"=>1}]}}
{3=>{"2021-02-23"=>[{"day"=>"2021-02-23", "policy_state"=>3, "count"=>5}], "2021-02-25"=>[{"day"=>"2021-02-25", "policy_state"=>3, "count"=>4}]}}
{4=>{"2021-02-23"=>[{"day"=>"2021-02-23", "policy_state"=>4, "count"=>89}], "2021-02-25"=>[{"day"=>"2021-02-25", "policy_state"=>4, "count"=>90}]}}

如何从 day 中获取值并计算并创建值对?我正在尝试使用 squid 创建一个图表,它使用某种格式的数据。

标签: rubygroup-by

解决方案


您在第一组之后对结果进行分组,但哈希内容保持不变,您可以使用 map 仅使用您需要的值创建新哈希:

report['count_by_state'].group_by { |count| count['policy_state'] }
                        .transform_values do |val|
                          val.to_h { |hash| hash.values_at('day', 'count') }
                        end
# {
# 2=>{"2021-02-23"=>48, "2021-02-25"=>1},
# 3=>{"2021-02-23"=>5,  "2021-02-25"=>4},
# 4=>{"2021-02-23"=>89, "2021-02-25"=>90}
# }

to_h是 的简短版本map { |...| [x, y] }.to_h,如果您的 Ruby 版本还不支持它,您可以使用它。


推荐阅读