如何使用数组中的键初始化哈希?

use*_*440 8 ruby hash

如何使用以下数组中的键初始化哈希?

keys = [ 'a' , 'b' , 'c' ]
Run Code Online (Sandbox Code Playgroud)

期望的哈希h应该是:

puts h 
# { 'a' => nil , 'b' => nil , 'c' => nil }
Run Code Online (Sandbox Code Playgroud)

Aru*_*hit 11

我们在这里使用Enumerable#each_with_objectHash::[].

 keys = [ 'a' , 'b' , 'c' ]
 Hash[keys.each_with_object(nil).to_a]
 # => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)

或使用 Array#product

keys = [ 'a' , 'b' , 'c' ]
Hash[keys.product([nil])]
# => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)


tor*_*o2k 6

另一个替代方案Array#zip:

Hash[keys.zip([])]
# => {"a"=>nil, "b"=>nil, "c"=>nil}
Run Code Online (Sandbox Code Playgroud)

更新:根据Arup Rakshit的建议,这里提出的解决方案之间的性能比较:

require 'fruity'

ary = *(1..10_000)

compare do
  each_with_object {  ary.each_with_object(nil).to_a  }
  product          {  ary.product([nil])  }
  zip              {  ary.zip([])  }
  map              {  ary.map { |k| [k, nil] }  }
end
Run Code Online (Sandbox Code Playgroud)

结果:

Running each test once. Test will take about 1 second.
zip is faster than product by 19.999999999999996% ± 1.0%
product is faster than each_with_object by 30.000000000000004% ± 1.0%
each_with_object is similar to map
Run Code Online (Sandbox Code Playgroud)

  • @ArupRakshit`zip`更快,但肯定`each_with_index`更清晰灵活(使用`zip`你不能产生像'{'a'=> [],'b'=> []的散列, ......`.我的选择是使用"产品",这是最好的妥协,恕我直言. (3认同)

ste*_*lag 6

使用新的(Ruby 2.1)to_h:

keys.each_with_object(nil).to_h
Run Code Online (Sandbox Code Playgroud)