Как объединить хэши Ruby - PullRequest
       23

Как объединить хэши Ruby

45 голосов
/ 07 декабря 2011

Как я могу объединить эти два хэша:

{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}

Чтобы получить:

{:car => {:color => "red", :speed => "100mph"}}

Ответы [ 4 ]

61 голосов
/ 07 декабря 2011

Существует метод Hash#merge:

ruby-1.9.2 > a = {:car => {:color => "red"}}
 => {:car=>{:color=>"red"}} 
ruby-1.9.2 > b = {:car => {:speed => "100mph"}}
 => {:car=>{:speed=>"100mph"}} 
ruby-1.9.2 > a.merge(b) {|key, a_val, b_val| a_val.merge b_val }
 => {:car=>{:color=>"red", :speed=>"100mph"}} 

Вы можете создать рекурсивный метод, если вам нужно объединить вложенные хэши:

def merge_recursively(a, b)
  a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
end

ruby-1.9.2 > merge_recursively(a,b)
 => {:car=>{:color=>"red", :speed=>"100mph"}} 
36 голосов
/ 14 октября 2012

Hash#deep_merge

Рельсы 3.0 +

a = {:car => {:color => "red"}}
b = {:car => {:speed => "100mph"}}
a.deep_merge(b)
=> {:car=>{:color=>"red", :speed=>"100mph"}} 

Источник: https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do Слайд 24

Кроме того,

http://apidock.com/rails/v3.2.13/Hash/deep_merge

10 голосов
/ 19 декабря 2016

Вы можете использовать метод merge, определенный в библиотеке ruby.https://ruby -doc.org / core-2.2.0 / Hash.html # method-i-merge


Пример

h1={"a"=>1,"b"=>2} 
h2={"b"=>3,"c"=>3} 
h1.merge!(h2)

Это даст вам вывод, подобный этому {"a"=>1,"b"=>3,"c"=>3}

Merge метод не позволяет дублировать ключ, поэтому ключ b будет перезаписан с 2 до 3 .

Чтобы преодолеть вышеуказанную проблему, вы можете взломать merge метод следующим образом.

h1.merge(h2){|k,v1,v2|[v1,v2]}

Приведенный выше фрагмент кода даст вам вывод

{"a"=>1,"b"=>[2,3],"c"=>3}
2 голосов
/ 07 декабря 2011
h1 = {:car => {:color => "red"}}
h2 = {:car => {:speed => "100mph"}}
h3 = h1[:car].merge(h2[:car])
h4 = {:car => h3}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...