Каков наилучший способ переназначить хэш в Ruby? - PullRequest
3 голосов
/ 24 апреля 2009

Есть ли простой способ переназначить хеш в ruby ​​следующим образом:

от

{:name => "foo", :value => "bar"}

до:

{"foo" => "bar"}

Предпочтительно таким образом, чтобы упростить эту операцию при переборе массива хэшей этого типа:

от

[{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}]

до:

{"foo" => "bar", "foo2" => "bar2"}

Спасибо.

Ответы [ 5 ]

9 голосов
/ 24 апреля 2009
arr = [ {:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}]

result = {}
arr.each{|x| result[x[:name]] = x[:value]}

# result is now {"foo2"=>"bar2", "foo"=>"bar"}
3 голосов
/ 24 апреля 2009

Модифицированная версия кода Вансона Сэмюэля выполняет задуманное. Это однострочник, но довольно длинный.

arr = [{:name=>"foo", :value=>"bar"}, {:name=>"foo2", :value=>"bar2"}]

arr.inject({}){|r,item| r.merge({item['name'] => item['value']})}

# result {"foo" => "bar", "foo2" => "bar2"}

Я бы не сказал, что это красивее, чем версия Гишу.

1 голос
/ 16 апреля 2012

Я знаю, что это старый, но самый лучший способ добиться этого - отобразить массив хешей в массив кортежей, а затем использовать Hash [] для создания из него хеша, как показано ниже:

arr = [{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}]
Hash[ array.map { |item| [ item[:name], item[:value] ] } ]

# => {"foo"=>"bar", "foo2"=>"bar2"}
1 голос
/ 24 апреля 2009

Как правило, если у вас есть хэш вида {: name => "foo",: value => "bar"}, вам лучше использовать кортеж ["foo "," bar "].

arr = [["foo", "bar"], ["foo2", "bar2"]]
arr.inject({}) { |accu, (key, value)| accu[key] = value; accu }
0 голосов
/ 06 апреля 2016

немного поздно, но:

[{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h
...