我有一个
数组购物对象
属于城市对象
我想最终得到一个由县,然后是城市列出的哈希,然后频率......
我想出了这个,但感觉真的没有摩擦......
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
}
必须有一种干嘛的方法来做到这一点!
答案 0 :(得分:1)
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
}
答案 1 :(得分:0)
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}}