将数组转换为哈希的键,具有所有项的指定值?

时间:2014-09-27 14:20:25

标签: ruby hash

基本上,我想创建哈希{1959: 0, 1960: 0, 1961: 0, 1962: 0}等等而不用手动写出来。

我想我从[*1959..2014]开始,但不知道从哪里去。

3 个答案:

答案 0 :(得分:1)

您可以使用Hash::[]

Hash[(1959..1962).map { |x| [x, 0] }]
# => {1959=>0, 1960=>0, 1961=>0, 1962=>0}
Ruby 2.1 +中的

Enumerable#to_h

(1959..1962).map { |x| [x, 0] }.to_h
# => {1959=>0, 1960=>0, 1961=>0, 1962=>0}

(改变了产出简洁的结束年份)

答案 1 :(得分:1)

您可以在数组中使用inject来形成哈希,如下所示:

(1959..2014).inject({}) { |hash, year| hash[year] = 0; hash }

inject就像在每个成员中运行可枚举的每个成员一样,但它将2个参数传递给块,当前对象和可用于收集结果的对象,在本例中为散列。

或者,正如@sawa在下面的评论中指出的那样:

(1959..2014).each_with_object({}) { |year, hash| hash[year] = 0 }

each_with_object并不要求您像inject一样在块的末尾返回对象。

[edit]刚刚使用普通范围,而不是数组。添加了each_with_object选项。

答案 2 :(得分:1)

一种方式:

Hash[[*1959..2014].product([0])]