如何使这个哈希创建更漂亮

时间:2012-11-21 05:03:56

标签: ruby

我想知道是否有更优雅的方式来编写以下几行:

section_event_hash = []
sections.each do |s|
   section_event_hash << { s => s.find_all_events }
end

我想创建一个哈希,其键是sections的元素,值是find_all_events方法返回的元素数组。

3 个答案:

答案 0 :(得分:3)

如果您希望section_event_hash真的是哈希而不是数组,那么您可以使用each_with_object

section_event_hash = sections.each_with_object({}) { |s, h| h[s] = s.find_all_events }

您可以使用map构建数组数组,然后将其提供给Hash[]

section_event_hash = Hash[sections.map { |s| [s, s.find_all_events] }]

答案 1 :(得分:1)

您发布的代码并不能完成您所说的内容。让我们通过测试来仔细研究它:

sections = ["ab", "12"]

section_event_hash = []
sections.each do |s|
   section_event_hash << { s => s.split("") }
end

puts section_event_hash.inspect

给出:

[{"ab"=>["a", "b"]}, {"12"=>["1", "2"]}]

所以你实际上已经创建了一个哈希数组,其中每个哈希都包含一个键值对。

以下代码生成一个包含多个元素的哈希。请注意如何使用{}而不是[]创建空哈希。大括号是哈希的符号,而方括号是指特定的键。

section_event_hash = {}
sections.each do |s|
   section_event_hash[s] = s.split("")
end

puts section_event_hash.inspect

=&GT; {"ab"=>["a", "b"], "12"=>["1", "2"]}

更优雅&#34;这样做的方式,取决于你的定义。正如其他答案所示,在ruby中通常有不止一种方法可以做。 seph的产生与原始代码相同的数据结构,而mu产生你描述的哈希。就个人而言,我只针对易于阅读,理解和维护的代码。

答案 2 :(得分:0)

array_of_section_event_hashes = sections.map do |s|
  {s => s.find_all_events}
end