Дано:
original = {
[ '1', 'friend' ] => 100,
[ '1', 'family' ] => 23,
[ '2', 'friend' ] => 43,
[ '2', 'family' ] => 65
}
Вы можете легко добраться туда, комбинируя авививификацию га sh:
desired = Hash.new { |h, k| h[k] = { } }
и некоторые вложенные разрушения:
original.each_with_object(desired) do |((loc, ref), n), h|
h[loc][ref] = n
end
desired
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
Или, если вам не нравится предварительный клик desired
:
desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }) do |((loc, ref), n), h|
h[loc][ref] = n
end
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
или, возможно,
reorg = ->(((loc, ref), n), h) { h[loc][ref] = n }
desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }, &reorg)
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}