进行以下转换的最简单方法是什么?
[#Obj<name: "a", value: 1>, #Obj<name: "a", value: 2>, #Obj<name: "a", value: 3>, #Obj<name: "b", value: 1>, #Obj<name: "b", value: 2>]
=&GT;
{
"a"=> [1, 2, 3],
"b"=> [1, 2]
}
答案 0 :(得分:3)
您可以使用each_with_object
执行以下操作:
arry.each_with_object(Hash.new { |h,k| h[k] = [] }) do |ob,hash|
hash[ob.name] << ob.value
end
答案 1 :(得分:3)
也许使用inject
来处理列表。方法inject
和reduce
是等价的(一个是另一个的别名)。
hash = my_arr.inject({}) do |h, o|
(h[o.name] ||= []) << o.value
h
end
这可以为您提供您正在寻找的结果。
答案 2 :(得分:3)
你可以这样做:
array = [#Obj<name: "a", value: 1>, #Obj<name: "a", value: 2>, #Obj<name: "a", value: 3>, #Obj<name: "b", value: 1>, #Obj<name: "b", value: 2>]
hash = Hash.new {|h,k| h[k] = []}
array.each {|e| hash[e.name] << e.value}
或者,如果您喜欢循环:
for e in array
(h ||= Hash.new {|h,k| h[k] = [] })[e.name] << e.value
end
答案 3 :(得分:1)
使用Enumerable#reduce
。例如。如果arr
是您的数组:
arr.reduce(Hash.new{|h, k| h[k] = []}) do |hash, obj|
hash[obj.name] << obj.value
hash
end