Ruby转换将Hashes数组合并到另一个Hash数组中?

时间:2013-02-08 16:08:51

标签: ruby

我有

 [
   {:date => "2012-05", :post => 1}, 
   {:date => "2012-12", :post => 1}, 
   {:date => "2013-02", :post => 1}, 
   {:date => "2012-05", :online => 1}
 ]

我想得到:

[
  {:date => "2012-05", :post => 1, :online => 1}, 
  {:date => "2012-12", :post => 1 }, 
  {:date => "2013-02", :post => 1 }
]

任何人都会看到如何应用Ruby哈希/数组方法来实现这一目标?

5 个答案:

答案 0 :(得分:6)

q.group_by { |x| x[:date] }.values.map { |e| e.reduce :merge }

答案 1 :(得分:3)

功能方法:

items_by_date = items.group_by { |h| h[:date] }
result = items_by_date.map { |date, hs| hs.reduce(:merge) }

答案 2 :(得分:1)

您可以通过injectdetect解决问题:

arr = [
        {:date => "2012-05", :post => 1}, 
        {:date => "2012-12", :post => 1}, 
        {:date => "2013-02", :post => 1}, 
        {:date => "2012-05", :online => 1}
      ]

arr.inject([]) do |new_array, a|

  # if there is an existing hash in the new array with the same date
  # merge the values
  #
  if existing = new_array.detect{ |b| a[:date] == b[:date] } 
    existing.merge!(a)
  else
    new_array << a
  end

  # always return the new array for new iteration
  #
  new_array
end

答案 3 :(得分:0)

这是一次尝试:

a = {:date=>"2012-05", :post=>1}, {:date=>"2012-12", :post=>1}, {:date=>"2013-02", :post=>1}
b = {:date=>"2012-05", :online=>1}

ar = {}; [a, b].flatten.each do |k|
  c = k.first[1]; ar[c] ||= Array.new
  ar[c] << { k.to_a.last[0] => k.to_a.last[1] }
end

ar.map { |k,v| { k => v[1] ? v[0].merge(v[1]) : v[0] } }

答案 4 :(得分:0)

hash = [
   {:date => "2012-05", :post => 1}, 
   {:date => "2012-12", :post => 1}, 
   {:date => "2013-02", :post => 1}, 
   {:date => "2012-05", :online => 1}
 ]

hash.group_by{ |h| h[:date] }.values.map{ |x| x.reduce(:merge) }
=> [{:date=>"2012-05", :post=>1, :online=>1},
    {:date=>"2012-12", :post=>1},
    {:date=>"2013-02", :post=>1}]