将Ruby数组重组为哈希

时间:2009-09-10 14:34:20

标签: ruby arrays hash

我有一个Products数组,每个数组都有一个名称和一个类别。我想生成一个散列,其中每个键都是一个类别字符串,每个元素都是具有该类别的产品,类似于以下内容:

{ "Apple" => [ <Golden Delicious>, <Granny Smith> ], ...
  "Banana" => ...

这可能吗?

4 个答案:

答案 0 :(得分:8)

在1.8.7+或者active_support(或者我认为是facet)中,你可以使用group_by:

products.group_by {|prod| prod.category}

答案 1 :(得分:3)

h = Hash.new {|h, k| h[k] = []}
products.each {|p| h[p.category] << p}

答案 2 :(得分:1)

oneliner

arr = [["apple", "granny"],["apple", "smith"], ["banana", "chiq"]]
h = arr.inject(Hash.new {|h,k| h[k]=[]}) {|ha,(cat,name)| ha[cat] << name; ha}

: - )

但我同意,#group_by更优雅。

答案 3 :(得分:0)

# a for all
# p for product
new_array = products.inject({}) {|a,p| a[p.category.name] ||= []; a[p.category.name] << p}