Ruby 如何合并数组的散列?

Ruby 如何合并数组的散列?,ruby,Ruby,我有一个数组: [ {a => 1, b => { c => 1, d => 1}}, {a => 1, b => { c => 1, d => 2}}, {a => 1, b => { c => 2, d => 2}}, {a => 2, b => { c => 1, d => 1}}, ] 我想将其更改为: [ {a => 1, b => [{ c => 1, d =

我有一个数组:

[
 {a => 1, b => { c => 1, d => 1}},
 {a => 1, b => { c => 1, d => 2}},
 {a => 1, b => { c => 2, d => 2}},
 {a => 2, b => { c => 1, d => 1}},
]
我想将其更改为:

[
 {a => 1, b => [{ c => 1, d => [1, 2]}, { c => 2, d => [2]}]},
 {a => 2, b=> [ { c=> 1, d => [1] } ]}
]
规则/要求:

  • a
    值相同的哈希值转到一个哈希值

  • b
    应该是
    {c=>,d=>}

  • d
    应该是一个数组

  • d
    使用相同的
    c
    值转到同一数组


    • 这里有一个解决方案。它非常明确,因此不会推广到其他哈希结构

      hashes = [
       {:a => 1, :b => { :c => 1, :d => 1}},
       {:a => 1, :b => { :c => 1, :d => 2}},
       {:a => 1, :b => { :c => 2, :d => 2}},
       {:a => 2, :b => { :c => 1, :d => 1}},
      ]
      
      a_values = {}
      hashes.each do |hash|
        a_value = hash[:a]
        a_values[a_value] ||= {}
      
        c_value = hash[:b][:c]
        a_values[a_value][c_value] ||= { :c => c_value, :d => [] }
      
        d_value = hash[:b][:d]
        a_values[a_value][c_value][:d].push(d_value)
      end
      
      # Now aggregate the results
      results = a_values.map do |a_value, c_hashes|
        b_arr = c_hashes.map { |c_value, c_hash| c_hash }
        { :a => a_value, :b => b_arr }
      end
      
      以下是输出:

      [
        {:a=>1, :b=>[{:c=>1, :d=>[1, 2]}, {:c=>2, :d=>[2]}]}, 
        {:a=>2, :b=>[{:c=>1, :d=>[1]}]}
      ]
      

      你是说a=>1还是
      :a=>1
      ?如果不是,则
      a
      是局部变量还是方法?考虑到您有
      a=>1
      c=>1
      等,导致
      d=>[2]
      而不是
      d=>2
      d=>[1]
      而不是
      1
      的规则是什么?您的问题是有问题的,因为生成输出的规则不清楚。