合并包含哈希的数组 - Ruby

时间:2015-03-26 21:23:20

标签: ruby arrays multidimensional-array hash

嘿伙计们,如果我有一个包含像这样的哈希的数组:

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'的所有哈希值合并为一个哈希值。

2 个答案:

答案 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}]