如何在没有0
循环的情况下将数组转换为值为each
的哈希值。
例如,给定此数组:
[1, 2, 3, 4]
我想得到这个哈希:
{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
答案 0 :(得分:8)
标准方法是Hash[...]:
Hash[xs.map { |x| [x.to_s, 0] }]
或Enumerable#mash
如果您碰巧使用Facets。我想不出更简洁和陈述性的东西:
xs.mash { |x| [x.to_s, 0] }
答案 1 :(得分:4)
array.inject({}) { | a, e | a[e.to_s] = 0; a }
或以更干净的方式(感谢tokland,请参阅评论中的讨论)
array.inject({}) { | a, e | a.update(e.to_s => 0) }
答案 2 :(得分: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}
答案 3 :(得分:0)
好吧,实际上,我会使用each_with_object
,但发布此内容更有趣。
ary = *1..4
hash = Hash[ary.zip ary.dup.fill 0]
hash # => {1=>0, 2=>0, 3=>0, 4=>0}