2013-04-02 601 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