如何将数组转换为散列,将数组元素作为散列键,并将所有散列值都设置为给定值

时间:2014-05-15 17:06:11

标签: ruby arrays hash

使用Ruby 2.1(使用ActiveSupport 3.x,如果有帮助),我想转换这样的数组:

[ :apples, :bananas, :strawberries ]

进入这样的哈希:

{ :apples => 20, :bananas => 20, :strawberries => 20 }

从技术上讲,这有效:

array = [ :apples, :bananas, :strawberries ]
hash = Hash[array.zip(Array.new(array.length, 20))]
# => {:apples=>20, :bananas=>20, :strawberries=>20}

但这看起来很笨重,我觉得有一种更简单的方法可以做到这一点。有吗?

我查看了Enumerable#zip以及Hash#new默认值选项,但没有看到任何提供此转换的简单方法。

3 个答案:

答案 0 :(得分:3)

使用Hash[]

Hash[array.map { |f| [f, 20] }]

答案 1 :(得分:3)

我认为Array#product会对此有所帮助:

ary = [ :apples, :bananas, :strawberries ]
Hash[ary.product([20])]
# => {:apples=>20, :bananas=>20, :strawberries=>20}

答案 2 :(得分:3)

另一个答案:

ary = [ :apples, :bananas, :strawberries ]
Hash[[*ary.each_with_object(20)]]
# => {:apples=>20, :bananas=>20, :strawberries=>20}

或者(正如OP指出的那样):

ary.each_with_object(20).to_h
# => {:apples=>20, :bananas=>20, :strawberries=>20}

基本上,调用each_with_object会返回一个Enumerator对的对象,这些对包含每个值和数字20(即[:apples, 20], ...),后者可以随后转换为散列。