动态地将键和值添加到散列内的散列和散列

时间:2016-05-26 18:59:17

标签: arrays ruby hash

我有一系列名字

department = ['name1', 'name2', 'name3']

和几个月的数组

month = ['jan', 'feb', 'mar', 'etc']

我需要动态地将这些数组合并为哈希,如下所示:

h = {'name1' => {'jan' => '', 'feb' => '', 'mar' => '', 'etc' => ''},
'name2' => {'jan' => '', 'feb' => '', 'mar' => '', 'etc' => ''}, 'name3' => {'jan' => '', 'feb' => '', 'mar' => '', 'etc' => ''}}

我如何动态地将密钥添加到哈希?

5 个答案:

答案 0 :(得分:4)

这是一种方式:

department
  .each_with_object({}) do |name, h|
     # taking an empty hash which will be holding your final output.
     h[name] = month.product([""]).to_h
   end

阅读Array#product以了解month.product([""])行如何运作。您可以使用to_h将数组数组转换为哈希值。

答案 1 :(得分:2)

通常情况下,答案在于Enumerable的力量:

Hash[
  department.map do |d|
    [
      d,
      Hash[
        month.map do |m|
          [ m, '' ]
        end
      ]
    ]
  end
]

这里有很多内容,但它归结为一个两部分的过程,一个将department列表转换为哈希哈希值,另一个部分用转换后的{{1}填充它结构。

month是将键/值对转换为适当的Hash结构的便捷方式。

答案 2 :(得分:0)

department = ['name1', 'name2', 'name3']
month = ['jan', 'feb', 'mar', 'etc']

month_hash = month.each_with_object({}) { |m, res| res[m] = '' }
result = department.each_with_object({}) { |name, res| res[name] = month_hash.dup }

p result

这样你可以构建month_hash,然后用它来构建你需要的结果哈希

答案 3 :(得分:0)

这是我将如何做到的。

1)从你的月份阵列中挖出一个哈希

month_hash = Hash[month.map { |m| [m ,''] }]

2)从你的部门阵列中取出哈希,插入新制作的月份哈希值。

result_hash = Hash[department.map { |d| [d, month_hash] }]

答案 4 :(得分:0)

month = ['jan', 'feb', 'mar', 'etc']
department = ['name1', 'name2', 'name3']

month_hash = month.map {|m| [m, '']}.to_h
p department.map {|d| [d, month_hash]}.to_h