如何将 Array 转换为 Hash 值,0
而无需each
循环。
例如,给定这个数组:
[1, 2, 3, 4]
我想得到这个哈希:
{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
标准方法是Hash[...]:
Hash[xs.map { |x| [x.to_s, 0] }]
或者Enumerable#mash
,如果您碰巧使用 Facets。我想不出更简洁和声明性的东西:
xs.mash { |x| [x.to_s, 0] }
array.inject({}) { | a, e | a[e.to_s] = 0; a }
或者以更干净的方式(感谢tokland,请参阅评论中的讨论)
array.inject({}) { | a, e | a.update(e.to_s => 0) }
我是一个简单的粉丝,而且我永远记不起究竟是多么疯狂的事情#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}
好的,实际上,我会使用each_with_object
,但发布它是因为它更有趣。
ary = *1..4
hash = Hash[ary.zip ary.dup.fill 0]
hash # => {1=>0, 2=>0, 3=>0, 4=>0}