4

是否有一种简单的方法可以通过以下方式在 ruby​​ 中重新映射哈希:

从:

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

到:

{"foo" => "bar"}

最好以一种在迭代这种类型的哈希数组时使执行此操作变得简单的方式:

从:

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

到:

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

谢谢。

4

5 回答 5

9
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"}
于 2009-04-24T08:31:07.620 回答
3

Vanson Samuel 代码的修改版本可以达到预期目的。这是一个单行,但很长。

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

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

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

不过,我不会说它比 Gishu 的版本更漂亮。

于 2009-04-24T14:22:15.527 回答
1

作为一般的经验法则,如果你有一个 {:name => "foo", :value => "bar"} 形式的哈希,你通常最好使用 ["foo", "酒吧”]。

arr = [["foo", "bar"], ["foo2", "bar2"]]
arr.inject({}) { |accu, (key, value)| accu[key] = value; accu }
于 2009-04-24T17:44:57.477 回答
1

我知道这是旧的,但实现这一点的最巧妙方法是将哈希数组映射到元组数组,然后使用 Hash[] 从中构建哈希,如下所示:

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

# => {"foo"=>"bar", "foo2"=>"bar2"}
于 2012-04-16T05:30:15.430 回答
0

有点晚了,但是:

[{ name: "foo", value: "bar" },{name: "foo2", value: "bar2"}].map{ |k| k.values }.to_h
于 2016-04-06T10:32:41.623 回答