如何将数组转换为具有指定公共值的哈希

时间:2015-07-28 14:50:33

标签: arrays ruby hash

我有一个数组:arr = [:a, :b, :c]

我想要一个散列,其中上述每个值都是一个空值为空的散列值:hsh = {a: {}, b: {}, c: {}}

最简洁的方式是什么(并且有性能权衡)?

这是我目前的解决方案:

arr.inject({}) do |hash, entry|
  hash[entry] = {}
  hash
end

5 个答案:

答案 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] = {}}