2

如何将 Array 转换为 Hash 值,0而无需each循环。

例如,给定这个数组:

[1, 2, 3, 4]

我想得到这个哈希:

{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
4

4 回答 4

8

标准方法是Hash[...]

Hash[xs.map { |x| [x.to_s, 0] }]

或者Enumerable#mash,如果您碰巧使用 Facets。我想不出更简洁和声明性的东西:

xs.mash { |x| [x.to_s, 0] }
于 2012-09-10T22:08:23.733 回答
4
array.inject({}) { | a, e | a[e.to_s] = 0; a }

或者以更干净的方式(感谢tokland,请参阅评论中的讨论)

array.inject({}) { | a, e | a.update(e.to_s => 0) }
于 2012-09-10T22:06:11.763 回答
2

我是一个简单的粉丝,而且我永远记不起究竟是多么疯狂的事情#inject或 Hash 构造函数参数是如何工作的。

array = [1, 2, 3, 4]
hash = {}

array.each do |obj|
  hash[obj.to_s] = 0
end

puts hash.inspect # {"1"=>0, "2"=>0, "3"=>0, "4"=>0}
于 2012-09-10T22:12:21.107 回答
0

好的,实际上,我会使用each_with_object,但发布它是因为它更有趣。

ary = *1..4

hash = Hash[ary.zip ary.dup.fill 0]

hash # => {1=>0, 2=>0, 3=>0, 4=>0}
于 2012-09-10T23:32:24.510 回答