繁体   English   中英

按 ruby​​ 中的值对哈希进行分组

[英]Group Hash by values in ruby

我在 ruby​​ 中有一个散列,看起来像这样:

{
  "admin_milestones"=>"1",
  "users_milestones"=>"0",
  "admin_goals"=>"1",
  "users_goals"=>"0", 
  "admin_tasks"=>"1", 
  "users_tasks"=>"0",
  "admin_messages"=>"1",
  "users_messages"=>"0",
  "admin_meetings"=>"1",
  "users_meetings"=>"0"
}

我正在寻找一种解决方案,可以将这个散列分成两部分,一个值为 1,另一个散列值为 0。

您可以按其值对哈希进行分组:

h1 = {
  "admin_milestones"=>"1",
  "users_milestones"=>"0",
  "admin_goals"=>"1",
  "users_goals"=>"0", 
  "admin_tasks"=>"1", 
  "users_tasks"=>"0",
  "admin_messages"=>"1",
  "users_messages"=>"0",
  "admin_meetings"=>"1",
  "users_meetings"=>"0"
}

h2 = h1.group_by{|k,v| v}

它将产生一个按其值分组的散列,如下所示:

h2 = {"1"=>[["admin_milestones", "1"], ["admin_goals", "1"], ["admin_tasks", "1"], ["admin_messages", "1"], ["admin_meetings", "1"]], 
"0"=>[["users_milestones", "0"], ["users_goals", "0"], ["users_tasks", "0"], ["users_messages", "0"], ["users_meetings", "0"]]} 

如果你想要一个数组作为答案,最干净的解决方案是分区方法。

zeros, ones = my_hash.partition{|key, val| val == '0'}

您应该在keys数组上使用group_by并将值用作分组元素:

h1 = {
  "admin_milestones"=>"1",
  "users_milestones"=>"0",
  "admin_goals"=>"1",
  "users_goals"=>"0", 
  "admin_tasks"=>"1", 
  "users_tasks"=>"0",
  "admin_messages"=>"1",
  "users_messages"=>"0",
  "admin_meetings"=>"1",
  "users_meetings"=>"0"
}

# group_by on the keys, then use the value from the hash as bucket
h2 = h1.keys.group_by { |k| h1[k] }

puts h2.inspect

返回从值到键数组的散列:

{
    "1" => [
        [0] "admin_milestones",
        [1] "admin_goals",
        [2] "admin_tasks",
        [3] "admin_messages",
        [4] "admin_meetings"
    ],
    "0" => [
        [0] "users_milestones",
        [1] "users_goals",
        [2] "users_tasks",
        [3] "users_messages",
        [4] "users_meetings"
    ]
}

只是Hash.select

h1.select { |key, value| value == '0' } #=> {"users_milestones"=>"0", "users_goals"=>"0", ...}
h1.select { |key, value| value == '1' } #=> {"admin_milestones"=>"1", "admin_goals"=>"1", ...}

返回值取决于您的 Ruby 版本。 Ruby 1.8 返回一个数组数组,而 Ruby 1.9 返回一个散列,就像上面的例子一样。

https://stackoverflow.com/a/56164608/14718545类似,您可以使用group_by但使用then ,在这种情况下,您将避免实例化额外的变量。

{
  "admin_milestones" => "1",
  "users_milestones" => "0",
  "admin_goals" => "1",
  "users_goals" => "0",
  "admin_tasks" => "1",
  "users_tasks" => "0",
  "admin_messages" => "1",
  "users_messages" => "0",
  "admin_meetings" => "1",
  "users_meetings" => "0"
}.then { |h| h.keys.group_by { |k| h[k] } }
{"1"=>["admin_milestones", "admin_goals", "admin_tasks", "admin_messages", "admin_meetings"],
 "0"=>["users_milestones", "users_goals", "users_tasks", "users_messages", "users_meetings"]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM