Реорганизация массива Ruby в хеш - PullRequest
4 голосов
/ 10 сентября 2009

У меня есть массив Products, у каждого из которых есть имя и категория. Я хотел бы создать хеш, в котором каждый ключ является строкой категории, а каждый элемент - продуктом этой категории, сродни следующему:

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

Возможно ли это?

Ответы [ 4 ]

8 голосов
/ 10 сентября 2009

В 1.8.7+ или с active_support (или, я думаю, аспектами) вы можете использовать group_by:

products.group_by {|prod| prod.category}
3 голосов
/ 10 сентября 2009
h = Hash.new {|h, k| h[k] = []}
products.each {|p| h[p.category] << p}
1 голос
/ 11 сентября 2009

Подложка

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 гораздо элегантнее.

0 голосов
/ 10 сентября 2009
# a for all
# p for product
new_array = products.inject({}) {|a,p| a[p.category.name] ||= []; a[p.category.name] << p}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...