2013-04-02 18 views
16

Diğerlerinin yanı sıra name ve data özniteliklerine sahip bir nesnem var. Ad olarak anahtar ve veri (bir dizi) değeri olarak kullanan bir karma oluşturmak istiyorum. map'u kullanarak aşağıdaki kodu nasıl azaltacağımı anlayamıyorum. Mümkün mü?Nesnelerin bir dizisini yineleyen Karma oluşturma

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

' karması. Ancak, bu, bu kodda yanlış bir şey olmadığını söyledi. Neden aynen sahip olduğun gibi kullanmıyorsun? –

+0

Karma [* self.forecasts.map {[fc.name, fc.data]}. Flatten] – Abid

+0

"Tahminler" nedir? Özellikle, onun sınıfı nedir? – sawa

cevap

20

Kullanım 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

+1, harika bir yöntem. –

+0

@theTinMan: teşekkürler, ben bu yöntem çok :) – apneadiving

+0

Evet, hem o çok aşık görünüyor seviyorum: p –

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

İş güvenliği: 1, Okunabilirlik: Bence niçin 0. – tadman

+0

@tadman Tam söz konusu formu aslında en iyisi ... –

+0

okuyucu hangi haritayı anladığını ve düzleştiğini anlarsa bu oldukça kolay okunur – Abid

0

Hep bunun için inject veya reduce kullanın:

dizisi döndürür ve geri dönmeyecek map`
self.forecasts.reduce({}) do |h,e| 
    h.merge(e.name => e.data) 
end 
İlgili konular