合并内部包含哈希的数组-Ruby

合并内部包含哈希的数组-Ruby,ruby,arrays,multidimensional-array,hash,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,

嘿,伙计们,如果我有一个包含如下哈希值的数组:

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对'number:456'的哈希组合在一起

这样,以键值对'number:123'开头的所有哈希都合并到一个哈希中,而以键值对'number:456'开头的所有哈希都合并到一个哈希中

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
键替换为
:time

def transform(arr)
  groups = arr.group_by {|x|x[:number]}.values.map {|x|x.reduce(:merge)}
  groups.each { |x| x[:time] = x[:number]; x.delete(:number) }
end
或者,包括将
:number
键替换为
:time

def transform(arr)
  groups = arr.group_by {|x|x[:number]}.values.map {|x|x.reduce(:merge)}
  groups.each { |x| x[:time] = x[:number]; x.delete(:number) }
end

一种方法是使用(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}] 

一种方法是使用(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}] 

是否总是有6个哈希?你总是想把它们一分为二吗?哪一个进入哪一个最终散列有关系吗?散列中是否总是有4个东西,第一个总是“时间”,后面有3个字母键?创建这两个散列的标准是什么?是的,是@Beartech说的。:)是否总是有6个哈希?你总是想把它们一分为二吗?哪一个进入哪一个最终散列有关系吗?散列中是否总是有4个东西,第一个总是“时间”,后面有3个字母键?创建这两个散列的标准是什么?是的,是@Beartech说的。:)很好-虽然你没有满足于将
:number
随意重命名为
:time
(!)很好-尽管你没有满足于将
:number
随意重命名为
:time
(!)