У меня есть массив Products, у каждого из которых есть имя и категория. Я хотел бы создать хеш, в котором каждый ключ является строкой категории, а каждый элемент - продуктом этой категории, сродни следующему:
Products
{ "Apple" => [ <Golden Delicious>, <Granny Smith> ], ... "Banana" => ...
Возможно ли это?
В 1.8.7+ или с active_support (или, я думаю, аспектами) вы можете использовать group_by:
products.group_by {|prod| prod.category}
h = Hash.new {|h, k| h[k] = []} products.each {|p| h[p.category] << p}
Подложка
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 гораздо элегантнее.
# a for all # p for product new_array = products.inject({}) {|a,p| a[p.category.name] ||= []; a[p.category.name] << p}