【发布时间】:2019-03-19 06:33:26
【问题描述】:
我有:
fruits = {
"orange" => {:season => "winter"},
"apple" => {:season => "winter"},
"banana" => {:season => "summer"},
"grape" => {:season => "spring"},
"peach" => {:season => "winter"},
"pineapple" => {:season => "summer"}
}
我想得到:
{
"winter"=>["orange", "apple", "peach"],
"summer"=>["banana", "pineapple"],
"spring"=>["grape"]
}
我做到了:
def sort_fruits(fruits_hash)
fruits=[]
sorted = {}
seasons = fruits_hash.map {|k, v|v[:season]}
seasons.uniq.each do |season|
fruits.clear
fruits_hash.each do |fruit, season_name|
if season == season_name[:season]
fruits << fruit
end
end
p sorted[season] = fruits ## season changes to new season, so this should have created new key/value pair for new season.
end
sorted
end
我明白了:
{
"winter"=>["grape"],
"summer"=>["grape"],
"spring"=>["grape"]
}
我不明白为什么添加具有唯一键的新键/值对会覆盖散列中的现有对。任何解释方面的帮助将不胜感激。
【问题讨论】:
-
既然你已经收到你的答案,你的方法也可以改写为:
fruits.group_by { |k,v| v[:season] }.transform_values {|v| v.map(&:first) }