如何将具有重复值的数组转换为ruby中的哈希?

时间:2014-05-02 15:40:49

标签: ruby

进行以下转换的最简单方法是什么?

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

4 个答案:

答案 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来处理列表。方法injectreduce是等价的(一个是另一个的别名)。

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