迭代两个哈希值,求和值并使用新密钥创建第三个哈希

问题描述:

我有两个哈希数组,我试图创建第三个哈希数组,将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

因为你期望的结果是[{: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

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中首次亮相。