如何合并数组哈希?

时间:2015-06-03 02:01:32

标签: 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 => [1, 2]}, { c => 2, d => [2]}]},
 {a => 2, b=> [ { c=> 1, d => [1] } ]}
]

规则/需求:

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

  • b应为{c => , d =>}

  • 的数组
  • d应为数组

  • 具有相同d值的
  • c转到同一个数组

1 个答案:

答案 0 :(得分:1)

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

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