Techioz Blog

ハッシュの配列を値でグループ化し、Ruby で構造 (ハッシュ) を保持する

概要

次のようなハッシュがあります:

  hash = {
    'en-us': {
      where: 'USA'
    },
    'en-us-zone2': {
      where: 'USA'
    },
    'en-nl': {
      where: 'Netherlands'
    },
    'en-pt': {
      where: 'Portugal'
    },
  }

そして、group_byを使用してそれらをグループ化しようとしました:

result = hash.group_by { |k,v| v[:where] }

ただし、ハッシュの配列ではなく、配列全体を返します。したがって、予想される結果と実際の結果は次のとおりです。

{ "USA"=>  
  [[:"en-us", {:where=>"USA"}], [:"en-us-zone2", {:where=>"USA"}]], 
 "Netherlands"=>
  [[:"en-nl", {:where=>"Netherlands"}]],
 "Portugal"=>
  [[:"en-pt", {:where=>"Portugal"}]]
}
{ "USA"=>
   [{:"en-us" => {:where=>"USA"}}, {:"en-us-zone2" => {:where=>"USA"}}]
  "Netherlands"=>
   [{:"en-nl" => {:where=>"Netherlands"}}]
  "Portugal"=>
   [{:"en-pt" => {:where=>"Portugal"}}]
}

実際はハッシュの配列ではなく、配列の配列であることを参照してください。ハッシュ キーが最初の配列要素になります。

:where に基づいてハッシュをグループ化するにはどうすればよいですか?

解決策

これは機能するはずです:

hash.group_by { |k,v| v[:where] }.each { |_, v| v.map! { |array| { array[0] => array[1] } } }

または、transform_values を使用して

hash.group_by { |k,v| v[:where] }.transform_values { |v| v.map { |array| {array[0] => array[1] } } }

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://ruby-doc.org/core-2.4.0/Hash.html#method-i-transform_values