如何将 Ruby 数组中的散列转换为单个散列?

4
如果我有一个像这样的散列数组:
[{"name"=>"apple", "value"=>"red"},
{"name"=>"banana", "value"=>"yellow"},
{"name"=>"grape", "value"=>"purple"}]

我如何将其转换为单个哈希值:

{apple: "red", banana: "yellow", grape: "purple"}

有比使用for循环更快的方法吗?


2
将使用哈希数组转换为单个哈希的过程转化为一个有意义的问题。 - Michael Durrant
2个回答

7
arr = [{"name"=>"apple",  "value"=>"red"},
       {"name"=>"banana", "value"=>"yellow"},
       {"name"=>"grape",  "value"=>"purple"}]

Hash[arr.map { |h| [h["name"].to_sym , h["value"]] }]
  #=> {:apple=>"red", :banana=>"yellow", :grape=>"purple"}

在Ruby 2.1+版本中

arr.map { |h| [h["name"].to_sym , h["value"]] }.to_h
  #=> {:apple=>"red", :banana=>"yellow", :grape=>"purple"}

我也在写同样的答案 :P,我只会添加symbolize_keys以匹配确切的结果 ;) - Dario Barrionuevo
这有点棘手,因为它依赖于名称/值键的顺序;如果其中一个哈希是 {"value" =>"red", "name"=>"apple"},它将产生错误的结果。 - Chris Heald
@ChrisHeald 这取决于 OP 拥有什么。没有明确说明是 OP 的错。如果顺序不能保证,OP 应该使用一个能够展示这一点的例子。 - sawa
谢谢@CarySwoveland。在我的情况下,顺序总是相同的。我应该注意到这一点。 - David Mckee

1

从数组创建哈希

如果您不需要使用符号作为键,可以使用以下方法:

fruits = [{"name"=>"apple",  "value"=>"red"},
          {"name"=>"banana", "value"=>"yellow"},
          {"name"=>"grape",  "value"=>"purple"}]
Hash[*fruits.flat_map(&:values)]
#=> {"apple"=>"red", "banana"=>"yellow", "grape"=>"purple"}

不区分访问

如果你只想使用符号而不是字符串访问元素,而且你并不关心键实际上将被存储为字符串,那么你可以要求加载 ActiveSupport gem 的一个小部分,并使用 HashWithIndifferentAccess

require 'active_support/core_ext/hash/indifferent_access'
fruits = [{"name"=>"apple",  "value"=>"red"},
          {"name"=>"banana", "value"=>"yellow"},
          {"name"=>"grape",  "value"=>"purple"}]
h = HashWithIndifferentAccess[*fruits.flat_map(&:values)]
h[:apple]
#=> "red"

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