在Ruby中重新映射Hash的最佳方法是什么?

时间:2009-04-24 08:16:42

标签: ruby hash remap

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

从:

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

为:

{"foo" => "bar"}

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

从:

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

为:

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

感谢。

5 个答案:

答案 0 :(得分: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"}

答案 1 :(得分: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的版本更漂亮。

答案 2 :(得分:1)

作为一般经验法则,如果你有一个{:name =>形式的哈希值“foo”,:value => “bar”},使用[“foo”,“bar”]的元组通常会更好。

arr = [["foo", "bar"], ["foo2", "bar2"]]
arr.inject({}) { |accu, (key, value)| accu[key] = value; accu }

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

有点晚了但是:

count_lte_70_1 = read_pixel.count((138, 18, 20, 255))