Получение частоты вложенных элементов с сохранением отношений - PullRequest
0 голосов
/ 02 августа 2011

У меня есть массив

  • магазинные объекты

    • которые принадлежат городским объектам

      • которые принадлежат объектам префектуры

Я бы хотел получить хеш, указанный префектурой, затем городом, затем частотой ...

Я придумал это, но это действительно не похоже на рубин ..

city_by_prefecture = shop_list.reduce({}){ |h,e|
  if h[e.prefecture.name].nil?
    h[e.prefecture.name] = {e.city.name => 1}
  elsif h[e.prefecture.name][e.city.name].nil?
    h[e.prefecture.name][e.city.name] = 1
  else
    h[e.prefecture.name][e.city.name] += 1
  end
  h
}

Должен быть СУХОЙ способ сделать это!

Ответы [ 2 ]

1 голос
/ 02 августа 2011
city_by_prefecture = shop_list.each_with_object({}){ |e,h|
  h[e.prefecture.name] ||= Hash.new(0)
  h[e.prefecture.name][e.city.name] += 1
}
0 голосов
/ 02 августа 2011
shops = [
  OpenStruct.new(:prefacture => "pre1", :city => "city1"), 
  OpenStruct.new(:prefacture => "pre1", :city => "city1"), 
  OpenStruct.new(:prefacture => "pre1", :city => "city2"), 
  OpenStruct.new(:prefacture => "pre2", :city => "city3"),
]

counts = Hash[shops.group_by(&:prefacture).map do |prefacture, shops_in_prefacture| 
  [prefacture, Hash[shops_in_prefacture.group_by(&:city).map do |city, shops_in_city| 
    [city, shops_in_city.size]
   end]] 
end]
# {"pre1"=>{"city1"=>2, "city2"=>1}, "pre2"=>{"city3"=>1}}
...