2016-07-28 56 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