random_arary = [
{number: 123, x: 2},
{number: 123, y: 7},
{number: 123, z: 2},
{number: 456, a: 3},
{number: 456, b: 4},
{number: 456, c: 0}
]
我希望将所有哈希合并到两个哈希中,如下所示:
random_array=
[
{time: 123, x: 2, y: 7, z: 2},
{time: 456, a: 3, b: 4, c: 0},
]
什么是接近这个的好方法?
编辑:为了使我的问题更清楚,我想将所有哈希与k.v对'number:123'组合在一起,并将所有哈希与k.v对'号码:456'组合在一起。
通过这种方式,以键值对'number:123'开头的所有哈希值合并为一个哈希值,并且键值对'number:456'的所有哈希值合并为一个哈希值。
答案 0 :(得分:4)
random_array.group_by {|x|x[:number]}.values.map {|x|x.reduce(:merge)}
# => [
# {:number=>123, :x=>2, :y=>7, :z=>2},
# {:number=>456, :a=>3, :b=>4, :c=>0}
# ]
或者,包括替换:number
的{{1}}:
:time
答案 1 :(得分:0)
一种方法是使用Hash#update(aka merge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值:
random_array.each_with_object({}) do |g,h|
h.update(g[:number]=>g.reject { |k,_| k==:number }) { |_,o,n| o.update(n) }
end.map { |nbr,h| h.merge(:time=>nbr) }
#=> [{:x=>2, :y=>7, :z=>2, :time=>123}, {:a=>3, :b=>4, :c=>0, :time=>456}]