我很难转换这个数组:
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!
传递给它会导致每次迭代都破坏性地合并散列,这样就不会浪费创建小散列副本的时间。
因此,在您的情况下,您需要对外部数组进行迭代,并使用.inject
将data
数组按摩为散列。