2016-07-28 80 views
0

修改陣列我有以下:ruby​​ .map!或每一個用於代替

article_results.keys do |key| 
    article_results[key].map! do |a| 
    a[:filename] = c.filename 
    a[:sitename] = c.site_name 
    a 
    end 
end 

正如我想要動態地添加到哈希內的每個陣列的每個元件,但由於某些原因a[:filename]a[:sitename]是空白時,他們用過的。

所以我想知道如果我應該使用.each來代替。 另外我想我想知道主要區別是什麼,因爲它們都可以用於副作用。

我添加了這個作爲額外的fyi,我使用的是Ruby 1.8.7,所以很高興知道它在版本(1.8.7 - 1.9+)之間的差異。

P.s.我知道.each.map之間有什麼區別,我特別要問的是.map!

回答

0

#map hashes有點不同的語義哈希比它對數組(和我認爲它不是非常一致的Ruby之間的版本)。一般來說,如果你正在尋找一個陣列的一些操作的結果 - #map是你的朋友,但是如果你想哈希一些操作的結果 - 你與#reduce更好:

article_results.reduce({}) do |hash, (key, value)| 
    hash.merge(key => value.merge(filename: c.filename, 
           sitename: c.sitename)) 
end 

另外,如果你不關心你的代碼是如何「功能」是,你可以使用#each

article_results.each do |key, value| 
    article_results[key].merge!(filename: c.filename, 
           sitename: c.sitename) 
end 
+0

我總是忘記有1.8.7之間的差異(這我目前被迫使用)和1.9+,我將其添加到操作中。減少看起來像注入,是同樣的事情?另外,article_results是一個散列哈希的對象數組哈希像setter&getters來添加額外的數據。 – Thermatix

+0

正確,reduce是別名注入(反之亦然)。這只是一個連貫命名的問題 - 地圖隨着減少,注入去與收集。從你的問題中的代碼看起來像'artice_results'是哈希散列(或行爲像散列的對象),所以'合併!'應該對它們起作用。如果沒有 - 直接使用'[] ='。 – keymone

+0

實際上,如果'article_results'是數組的散列,那麼你的'map!'代碼是正確的,你應該確保'c.filename'是有效的。和''.keys'不佔用一個塊,必須是'.keys.each' – keymone