将 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 到 Observable 转换块