按红宝石中的值分组哈希值

123*_*123 12 ruby ruby-on-rails

我在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"
}
Run Code Online (Sandbox Code Playgroud)

我试图寻找一个解决方案,可以将这个散列切换为两个部分,一个值为1,另一个散列值为0.

Ama*_*arg 29

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

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}
Run Code Online (Sandbox Code Playgroud)

它将生成一个按其值分组的哈希,如下所示:

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"]]} 
Run Code Online (Sandbox Code Playgroud)


hir*_*lau 6

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

zeros, ones = my_hash.partition{|key, val| val == '0'}
Run Code Online (Sandbox Code Playgroud)


Chr*_*bek 5

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

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
Run Code Online (Sandbox Code Playgroud)

返回从值到键数组的哈希值:

{
    "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"
    ]
}
Run Code Online (Sandbox Code Playgroud)