ruby массив хэшей с тем же значением - PullRequest
0 голосов
/ 17 мая 2018

У меня есть массив, созданный таким образом

[{"g"=>1, "f"=>"01"}, {"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"}, {"g"=>3, "f"=>"04"}, {"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]

, и мне нужно разбить на группы с одинаковым значением "g", как

[{"g"=>1, "f"=>"01"}],
[{"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"}],
[{"g"=>3, "f"=>"04"}],
[{"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]

Я пытался a.map{|a| a['g']}.uniq, чтобы найти все уникальные "g" и затем использовать each функцию к результирующему массиву, чтобы применить select к первому массиву, но не дать результата.Кто-нибудь знает, как разбить массив на группы?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я предпочитаю @ Max использовать group_by, но хочу показать альтернативу, которая должна быть схожей по эффективности.Оба производят хеш, а затем извлекают его значения.

arr = [{"g"=>1, "f"=>"01"}, {"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"},
       {"g"=>3, "f"=>"04"}, {"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]

arr.each_with_object({}) { |f,h| (h[f["g"]] ||= []) << f }.values
   #=> [[{"g"=>1, "f"=>"01"}],
   #    [{"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"}],
   #    [{"g"=>3, "f"=>"04"}], 
   #    [{"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]]
0 голосов
/ 17 мая 2018
input = [{"g"=>1, "f"=>"01"}, {"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"}, {"g"=>3, "f"=>"04"}, {"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]

grouped = input.group_by { |hash| hash["g"] }
# => {
#      1=>[{"g"=>1, "f"=>"01"}],
#      2=>[{"g"=>2, "f"=>"02"}, {"g"=>2, "f"=>"03"}],
#      3=>[{"g"=>3, "f"=>"04"}],
#      4=>[{"g"=>4, "f"=>"05"}, {"g"=>4, "f"=>"06"}]
#    }

Затем, чтобы получить решение, звоните grouped.values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...