【问题标题】:How can I convert a ruby array of hashes into a single hash?如何将 ruby​​ 哈希数组转换为单个哈希?
【发布时间】:2014-10-25 10:57:40
【问题描述】:

如果我从这样的哈希数组开始:

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

我怎样才能把它变成这个单一的哈希:

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

有没有比执行某种 for 循环更快的方法?

【问题讨论】:

  • 使用散列数组将其转换为一个有意义的问题到单个散列

标签: ruby-on-rails ruby hash


【解决方案1】:
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 来匹配确切的结果;)
  • 这有点不确定,因为它依赖于名称/值键的顺序;如果其中一个哈希是{"value" =>"red", "name"=>"apple"},则会产生错误的结果。
  • @ChrisHeald 这取决于 OP 有什么。没有说清楚是OP的错。如果不能保证顺序,则 OP 应该使用一个示例来说明这一点。
  • 感谢@CarySwoveland。在我的情况下,顺序总是相同的。我应该注意到这一点。
【解决方案2】:

从 Splatted 数组创建哈希

如果您实际上并不需要您的键是符号,这将起作用:

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

冷漠访问

如果您只想访问 带有符号而不是字符串的元素,并且您并不真正关心键是否实际存储为字符串,那么您可以需要一小部分 @ 987654321@ 并使用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"

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2010-12-11
    • 1970-01-01
    • 2019-10-27
    • 2019-05-23
    • 2015-11-26
    相关资源
    最近更新 更多