我有一系列名字
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' => ''}}
我如何动态地将密钥添加到哈希?
答案 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