如何在嵌套数组中合并哈希



我很难转换这个数组:

arr = [
{:type=>"Type One",
:data=>[
{'Wed, 01 Apr 2020'=>11.0},
{'Fri, 01 May 2020'=>0.0},
{'Mon, 01 Jun 2020'=>1081.5},
{'Wed, 01 Jul 2020'=>0.0}
]
},
{:type=>"Type Two",
:data=>[
{'Wed, 01 Apr 2020'=>19.55},
{'Fri, 01 May 2020'=>0.0},
{'Mon, 01 Jun 2020'=>68.56},
{'Wed, 01 Jul 2020'=>200.0}
]
}
] 

到此阵列:

[{:type=>"Type One",
:data=>{'Wed, 01 Apr 2020'=>11.0, 'Fri, 01 May 2020'=>0.0,
'Mon, 01 Jun 2020'=>1081.5, 'Wed, 01 Jul 2020'=>0.0}},
{:type=>"Type Two",
:data=>{'Wed, 01 Apr 2020'=>19.55, 'Fri, 01 May 2020'=>0.0,
'Mon, 01 Jun 2020'=>68.56, 'Wed, 01 Jul 2020'=>200.0}}]

如您所见,我希望将arr中每个哈希中的:data的值从一个单键哈希数组转换为一个哈希。

arr.map do |h|
h.each_with_object({}) do |(k,v),g|
g[k] = (k == :data) ? v.reduce(:merge) : v
end
end
#=> [{:type=>"Type One",
#     :data=>{'Wed, 01 Apr 2020'=>11.0, 'Fri, 01 May 2020'=>0.0,
#             'Mon, 01 Jun 2020'=>1081.5, 'Wed, 01 Jul 2020'=>0.0}},
#    {:type=>"Type Two",
#     :data=>{'Wed, 01 Apr 2020'=>19.55, 'Fri, 01 May 2020'=>0.0,
#             'Mon, 01 Jun 2020'=>68.56, 'Wed, 01 Jul 2020'=>200.0}}]

例如,如果

v = [{'Wed, 01 Apr 2020'=>11.0}, {'Fri, 01 May 2020'=>0.0},
{'Mon, 01 Jun 2020'=>1081.5}, {'Wed, 01 Jul 2020'=>0.0}]

然后

v.reduce(:merge)
#=> {"Wed, 01 Apr 2020"=>11.0, "Fri, 01 May 2020"=>0.0,
#    "Mon, 01 Jun 2020"=>1081.5, "Wed, 01 Jul 2020"=>0.0}

这可以被认为是的缩写

v.reduce { |h, g| h.merge(g) }

请参见Enumerable#reduce(又名inject(和Hash#merge。

您想要的似乎是将一个小散列数组组合成一个散列。您可以使用.inject()阵列方法来实现这一点:

a = [{Wed, 01 Apr 2020=>11.0}, {Fri, 01 May 2020=>0.0}]}
a.inject(:merge!)
=> {Wed, 01 Apr 2020=>11.0, Fri, 01 May 2020=>0.0}

Inject使用一个方法(或块(组合数组中的所有元素。将:merge!传递给它会导致每次迭代都破坏性地合并散列,这样就不会浪费创建小散列副本的时间。

因此,在您的情况下,您需要对外部数组进行迭代,并使用.injectdata数组按摩为散列。

最新更新