将 Ruby 中的哈希数组转换为一个哈希表

8

我有一个哈希数组,其中包含类似于以下内容的数组:

result = [
  {"id_t"=>["1"], "transcript_t"=>["I am a transcript ONE"]},
  {"id_t"=>["2"], "transcript_t"=>["I am a transcript TWO"]},
  {"id_t"=>["3"], "transcript_t"=>["I am a transcript THREE"]}
]

如果可能的话,我希望能够将它转换为一个哈希表,其中每个键值对都来自于每个哈希表的值。我觉得我没有解释清楚,以下是我的意思:
end_result = {
  "1"=>"I am a transcript ONE",
  "2"=>"I am a transcript TWO",
  "3"=>"I am a transcript THREE"
}

我一直在Stack Overflow和Google上搜索各种方法,但在这个过程中我变得困惑了。有没有什么办法可以实现这个目标?


1
你写过代码解决这个问题吗? - the Tin Man
与“transcript_t”键相关联的数组是否有可能拥有多个元素? - the Tin Man
@theTinMan 我已经将它达到了初始点,但我不会撒谎,我不知道如何开始这个最终的转换。我一直在寻找更详细的关于 map 的解释。transcript_t 数组永远不会有多个值。 - librarion
3个回答

14

我认为解决问题的关键是 Hash[],它可以基于一个键/值数组创建哈希,即:

Hash[[["key1", "value1"], ["key2", "value2"]]]
#=> {"key1" => "value1", "key2" => "value2"}

只需要添加一组map,您就有了解决方案!

result = [
  {"id_t"=>["1"], "transcript_t"=>["I am a transcript ONE"]},
  {"id_t"=>["2"], "transcript_t"=>["I am a transcript TWO"]},
  {"id_t"=>["3"], "transcript_t"=>["I am a transcript THREE"]}
]
Hash[result.map(&:values).map(&:flatten)]

很好,这个完美地奏效了。谢谢!有没有一个讲解使用 map 最佳实践的好资源呢?我经常需要它,但从不知道如何实现。 - librarion
1
@librarion map(&:values) 实际上是 map {|h| h.value } 的快捷方式(几乎可以这么说,它实际上调用了方法 value 上的 to_proc,因此速度较慢,但更容易阅读)。 我没有关于 map 最佳实践的资源,但每当您需要迭代可枚举项以返回其修改版本时,map(或其就地变体 map!)始终是正确的选择。 - Jean-Louis Giordano
1
现在我想起来了,你可以看一下 apidock:http://apidock.com/ruby/Enumerable/map - Jean-Louis Giordano
1
这里甚至还有一个视频!:) http://www.youtube.com/watch?feature=player_embedded&v=1zWj9BReAX8 - Jean-Louis Giordano

1

试试这个

result.inject({}){|acc, hash| acc[hash.values[0][0]] = hash.values[1][0]; acc }

=> { "1"=>"I am a transcript ONE", 
     "2"=>"I am a transcript TWO",
     "3"=>"I am a transcript THREE" } 

0
另一种可能性是使用 Enumerable#injectHash#merge 的组合:
result.inject({}) do |acc, hash|
   acc.merge({hash['id_t'].first => hash['transcript_t'].first})
end
=> { "1"=>"I am a transcript ONE",
     "2"=>"I am a transcript TWO",
     "3"=>"I am a transcript THREE" }

这样可以尽量减少[]结构的需要,以及; acc的显式返回附录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接