我有一个Products
数组,每个数组都有一个名称和一个类别。我想生成一个散列,其中每个键都是一个类别字符串,每个元素都是具有该类别的产品,类似于以下内容:
{ "Apple" => [ <Golden Delicious>, <Granny Smith> ], ...
"Banana" => ...
这可能吗?
答案 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}