2013-04-02 111 views
16

我有一个对象,其中包括属性namedata等等。我想创建一个使用名称作为键和数据(这是一个数组)作为值的散列。我无法弄清楚如何使用map来减少下面的代码。可能吗?创建哈希迭代对象数组

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

'map'返回一个数组,并不会返回哈希值。但是那就是说,这段代码没有任何问题。为什么不像你拥有它一样使用它? –

+0

哈希[* self.forecasts.map {[fc.name,fc.data]}。flatten] – Abid

+0

什么是'预测'?特别是,它的课程是什么? – sawa

回答

20

使用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} 
11
def fc_hash 
forecasts.each_with_object({}) do |forecast, hash| 
    hash[forecast.name] = forecast.data 
    end 
end 
+0

对于'each_with_object' +1,一个很好的方法。 –

+0

@theTinMan:谢谢,我也喜欢这种方法:) – apneadiving

+0

是的,你们俩看起来都非常迷恋它:p –

1
Hash[*self.forecases.map{ [fc.name, fc.data]}.flatten] 
+8

工作安全:1,可读性:0. – tadman

+0

@tadman正是我为什么认为问题中的表单实际上是最好的一个...... –

+0

如果读者理解什么地图和平坦是这个很容易阅读 – Abid

0

我总是用injectreduce此:

self.forecasts.reduce({}) do |h,e| 
    h.merge(e.name => e.data) 
end