将 Enumerable 转换为 Hash 的 Ruby 库函数

Posted

技术标签:

【中文标题】将 Enumerable 转换为 Hash 的 Ruby 库函数【英文标题】:Ruby library function to transform Enumerable to Hash 【发布时间】:2011-06-16 00:18:45 【问题描述】:

考虑这个对 Enumerable 的扩展:

module Enumerable

  def hash_on
    h = 
    each do |e|
      h[yield(e)] = e
    end
    h
  end

end

它是这样使用的:

people = [
  :name=>'fred', :age=>32,
  :name=>'barney', :age=>42,
]
people_hash = people.hash_on  |person| person[:name] 
p people_hash['fred']      # => :age=>32, :name=>"fred"
p people_hash['barney']    # => :age=>42, :name=>"barney"

是否有一个内置函数已经这样做了,或者足够接近它以至于不需要这个扩展?

【问题讨论】:

【参考方案1】:

Enumerable.to_h 将[key, value]s 的序列转换为Hash,因此您可以这样做:

people.map |p| [p[:name], p].to_h

如果您有多个值映射到同一个键,则保留最后一个。

【讨论】:

【参考方案2】:
[   :name=>'fred', :age=>32,
    :name=>'barney', :age=>42,
].group_by  |person| person[:name] 

=> "fred"=>[:name=>"fred", :age=>32],
   "barney"=>[:name=>"barney", :age=>42]

键是数组的形式,有可能有几个 Freds 或 Barneys,但如果你真的需要,你可以使用.map 来重构。

【讨论】:

以上是关于将 Enumerable 转换为 Hash 的 Ruby 库函数的主要内容,如果未能解决你的问题,请参考以下文章

Enumerable.Empty<T> 需要显式转换

为啥重复 Enumerable 到 Observable 转换块

如何将 ABS(HASH(...)) 从传统 sql 转换为标准 SQL

将 Array 转换为 Hash 删除重复键并同时添加值

Ruby将Object转换为Hash

尝试将具有多个XOR组件的PHP hash_hmac转换为coldfusion