18

我有一个具有属性的对象namedata等等。我想创建一个使用名称作为键和数据(这是一个数组)作为值的哈希。我不知道如何使用map. 是否可以?

def fc_hash
  fcs = Hash.new
  self.forecasts.each do |fc|
    fcs[fc.name] = fc.data
  end
  fcs
end
4

4 回答 4

23

使用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}
于 2013-04-02T18:55:43.557 回答
13
def fc_hash
 forecasts.each_with_object({}) do |forecast, hash|
    hash[forecast.name] = forecast.data
  end
end
于 2013-04-02T18:56:10.837 回答
3

我总是使用injectorreduce为此:

self.forecasts.reduce({}) do |h,e|
  h.merge(e.name => e.data)
end
于 2013-04-02T19:53:59.370 回答
1
Hash[*self.forecases.map{ [fc.name, fc.data]}.flatten]
于 2013-04-02T18:58:46.703 回答