我有一些对象,每个对象都有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" }
形式的单个哈希,最简洁的方法是什么。
答案 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"}