合并多个Ruby哈希属性

时间:2014-04-03 15:38:46

标签: ruby hash

我有一些对象,每个对象都有ids属性,这是id的散列。例如,person_1.ids{id1: "1", id2: "2"}person_2.ids{id1: "3", id2: "4"}person_3.ids{id1: "5", id2: "6"}。从这些对象的集合(或数组)(比如persons)到{ id1: "1,3,5", id2: "2,4,6" }形式的单个哈希,最简洁的方法是什么。

3 个答案:

答案 0 :(得分:3)

我会这样做:

person_1_ids = {id1: "1", id2: "2"}
person_2_ids = {id1: "3", id2: "4"}
person_3_ids = {id1: "5", id2: "6"}

hash = [person_1_ids,person_2_ids,person_3_ids].inject({}) do |out_hash,in_hash|
  out_hash.merge(in_hash) { |k,o,n| [o,n].join(',') }
end

hash # => {:id1=>"1,3,5", :id2=>"2,4,6"}

答案 1 :(得分:0)

person_1_ids = {id1: "1", id2: "2"}
person_2_ids = {id1: "3", id2: "4"}
person_3_ids = {id1: "5", id2: "6"}

(person_1_ids.to_a + person_2_ids.to_a + person_3_ids.to_a).group_by{|a| a.first}.each_with_object({}){|h, obj| obj[h.first] = h.last.transpose.last.join(",")}

答案 2 :(得分:0)

这是一个更简单(易于理解)的做同样事情的版本:

person_1_ids = {id1: "1", id2: "2"}
person_2_ids = {id1: "3", id2: "4"}
person_3_ids = {id1: "5", id2: "6"}

hash = Hash.new{|h,k| h[k] = []}

[person_1_ids,person_2_ids,person_3_ids].each do |h| 
  h.keys.each do |k|
    hash[k] << h[k]
  end
end

persons = {}

hash.keys.each do |k|
  persons[k] = hash[k].join(",")
end

puts persons #{:id1=>"1,3,5", :id2=>"2,4,6"}