我有一个数组:arr = [:a, :b, :c]
我想要一个散列,其中上述每个值都是一个空值为空的散列值:hsh = {a: {}, b: {}, c: {}}
最简洁的方式是什么(并且有性能权衡)?
这是我目前的解决方案:
arr.inject({}) do |hash, entry|
hash[entry] = {}
hash
end
答案 0 :(得分:9)
You can use each_with_object
instead of inject
to avoid the return value:
arr.each_with_object({}) { |k, h| h[k] = {} }
#=> {:a=>{}, :b=>{}, :c=>{}}
There's a shorter way hidden in the revisions, but Cary does not recommend it ;-)
答案 1 :(得分:4)
有很多方法,例如:
arr.zip([{}] * arr.size).to_h
或(后者,thx @Stefan,可能不是你想要的,因为它将共享所有键的一个哈希):
arr.product([{}]).to_h
答案 2 :(得分:3)
arr
被修改,如果您尚未访问它们,也会修改最初可用的密钥。- 每次要访问新密钥时,都会在数组中进行线性搜索。
Hash.new { |hash, key| hash[key] = {} if arr.include? key }
答案 3 :(得分:1)
我想出了几种技术
技术1
p Hash[arr.dup.fill{ |i| [arr[i], {}]}] # preserves original arr, works on copy (dup)
p Hash[arr.fill{ |i| [arr[i], {}]}] # mutates original arr
技术2
arr = [:a, :b, :c]
p Hash[arr.zip(Array.new(arr.length) { |i| i = {}})]
技术3 - 这是技术2的变体,使用Ruby 2.1中提供的to_h
方法
p [:a, :b, :c].instance_eval { self.zip(Array.new(self.length) {|i| i = {}})}.to_h
所有上述技术都会产生所需的
输出{:a=>{}, :b=>{}, :c=>{}}
答案 4 :(得分:0)
一种方法是使用each
:
hsh = {}
arr.each {|x| hsh[x] = {}}