2017-09-13 55 views
-4

我有兩個哈希數組,我試圖創建第三個哈希數組,將dates中的每個值添加到每個times值。迭代兩個哈希值,求和值並使用新密鑰創建第三個哈希

dates=[{a:­1},{a:2},{­a:3}] 
times=[{f:7,t:8}­,{f:9,t­:10},{f:11,t:12­}] 

我知道在兩個單哈希

dates={a:1} 
times={f:7,t:8} 

的情況下,我可以做

a=[] 
h={} 
h[:from]=d­ates[:a]+times[:f] 
h[:to]=dates[:a]+times­[:t] 
a<<h 

=> [{:from=>8, :to=>9}] 

我怎樣重複,以做到這一點對我的上述哈希陣列,好嗎?

我期望的結果是[{:from=>8,:to=>9},{:from=>10,:to=>11}, {:from=>12,:to=>13},{:from=>9,:to=>10},{:from=>11,:to=>12},{:from=>13,:to=>14},{:from=>10,:to=>11},{:from=>12,:to=>13},{:from=>14,:to=>15}]

+0

您的代碼包含幾個(不可見的)軟拷貝/粘貼時變成'-'的軟件。請修復它。 – Stefan

+0

@Stefan對不起,請看看我上面的更新。在我的例子中,我需要返回9個散列數組。基本上每個'a'必須與'times'中的每個值相加。 – matiss

回答

3

因爲你期望的結果是[{:from=>8,:to=>9},{:from=>10,:to=>11}..],我認爲,那是Cartesian product你在找什麼。

幸運的是,在RubyArray#product,這就是爲什麼該解決方案是如此簡單:

dates=[{a:1},{a:2},{a:3}] 
times=[{f:7,t:8},{f:9,t:10},{f:11,t:12}] 

result = dates.product(times).map do |date, time| 
    {from: date[:a] + time[:f], to: date[:a] + time[:t]} 
end 

puts result 
+0

謝謝!因爲我還在學習Ruby,所以這些內容非常豐富且有幫助。 – matiss

+0

@matiss你真的應該閱讀你正在使用的類(和模塊)的文檔(在這種情況下'Array','Hash'和'Enumerable')。它包含許多有用的例子。 – Stefan

+1

@Stefan所有這3個文檔都是隨時打開的,我讀過它們。只是我還不太明白他們是怎麼一起玩的。在這種情況下,'product'在Array下,'map'在'Enumerable'下,然而我認爲我正在使用Hash,所以我正在關注什麼我可以用Hash來做什麼:) – matiss

1
dates.product(times).map do |d,t| 
    n = d[:a] 
    t.transform_values { |v| v + n } 
end 
    #=> [{:f=>8, :t=> 9}, {:f=>10, :t=>11}, {:f=>12, :t=>13}, 
    # {:f=>9, :t=>10}, {:f=>11, :t=>12}, {:f=>13, :t=>14}, 
    # {:f=>10, :t=>11}, {:f=>12, :t=>13}, {:f=>14, :t=>15}] 

的第一步是

dates.product(times) 
    #=> [[{:a=>1}, {:f=>7, :t=>8}], [{:a=>1}, {:f=>9, :t=>10}], [{:a=>1}, {:f=>11, :t=>12}], 
    # [{:a=>2}, {:f=>7, :t=>8}], [{:a=>2}, {:f=>9, :t=>10}], [{:a=>2}, {:f=>11, :t=>12}], 
    # [{:a=>3}, {:f=>7, :t=>8}], [{:a=>3}, {:f=>9, :t=>10}], [{:a=>3}, {:f=>11, :t=>12}]] 

Array#productHash#transform_values,後者有在v2.4中首次亮相。