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

4
有没有一种简单的方法在Ruby中重新映射哈希表,使其按照以下方式进行:

从:

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

to:

{"foo" => "bar"}

最好的方式是在迭代这种哈希类型的数组时,使得执行此操作变得简单:
from:
[{:name => "foo", :value => "bar"}, {:name => "foo2", :value => "bar2"}]

to:

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

感谢您的选择。
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"}

是的,这几乎就是我所做的,但是我使用了x.values[0]和x.values[1]代替x[:name]和x[:value],以防我事先不知道键。我正在寻找更简单的方法来做到这一点,但可能没有更简单的方法了... - Fredrik Boström
3
哈希值无序,因此您不能执行 x.values [0] 和 x.values [1]。 - Vanson Samuel
+1 给 Vanson。你可以看到结果内容已经失去顺序,因为它是一个哈希表。 - Gishu

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的版本更漂亮。

1

通常而言,如果你有这样的哈希格式{:name => "foo", :value => "bar"},最好使用元组["foo", "bar"]。

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

1

我知道这已经过时了,但实现这个最简洁的方法是将哈希数组映射到元组数组,然后使用Hash[]从中构建哈希,如下所示:

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

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

0

有点晚了,但是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接