我有一个包含name
和data
属性的对象。我想创建一个哈希,它使用名称作为键,数据(数组)作为值。我无法弄清楚如何使用map
减少下面的代码。有可能吗?
def fc_hash
fcs = Hash.new
self.forecasts.each do |fc|
fcs[fc.name] = fc.data
end
fcs
end
答案 0 :(得分:21)
使用Hash[]
:
Forecast = Struct.new(:name, :data)
forecasts = [Forecast.new('bob', 1), Forecast.new('mary', 2)]
Hash[forecasts.map{|forecast| [forecast.name, forecast.data]}]
# => {"mary"=>2, "bob"=>1}
答案 1 :(得分:12)
def fc_hash
forecasts.each_with_object({}) do |forecast, hash|
hash[forecast.name] = forecast.data
end
end
答案 2 :(得分:1)
Hash[*self.forecases.map{ [fc.name, fc.data]}.flatten]
答案 3 :(得分:1)
我总是使用inject
或reduce
:
self.forecasts.reduce({}) do |h,e|
h.merge(e.name => e.data)
end