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



基本上,我想创建散列{1959: 0, 1960: 0, 1961: 0, 1962: 0}等等,而不需要手动写出它。

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

您可以使用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}

(为了输出的简洁性,更改了年末)

您可以将inject与数组一起使用来形成哈希,如下所示:

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

inject与每个类似,因为in在枚举对象的每个成员上运行,但它将2个参数传递给块、当前对象和一个可以用来收集结果的对象,在本例中是一个散列。

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

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

each_with_object不需要像inject那样在块的末尾返回对象。

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

单向:

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

最新更新