ハッシュの配列があり、それぞれに曜日キーがある場合:
[
{:day=>4,:name=>"Jay"},
{:day=>1,:name=>"Ben"},
{:day=>4,:name=>"Jill"}
]
ソートされた日の値をキーとしてハッシュに変換する最良の方法は何ですか:
{
:1=>[{:day=>1,:name=>"Ben"}],
:4=>[{:day=>4,:name=>"Jay"},{:day=>4,:name=>"Jill"}]
}
私はRuby 1.9.2とRails 3.1.1を使用しています
回答:
回答№1は4個人的には、実際に必要になるまで、キーを「ソート」する必要はありません(Ruby 1.9ではエントリごとの順序に相当します)。 group_by
:
arr = [{:day=>4,:name=>"Jay"}, {:day=>1,:name=>"Ben"}, {:day=>4,:name=>"Jill"}]
arr.group_by { |a| a[:day] }
=> {4=>[{:day=>4, :name=>"Jay"}, {:day=>4, :name=>"Jill"}],
1=>[{:day=>1, :name=>"Ben"}]}
代わりに、実際に必要なときにキーを並べ替えます。
回答№2の場合は1
配列が呼び出されると仮定すると list
、ここ」を使用する1つの方法 reduce
方法:
list.reduce({}) { |hash, item|
(hash[item[:day]] ||= []) << item; hash
}
ここで」を使用して別の map
メソッド、ただし、ホルダー変数を持ち歩く必要があります:
hash = {}
list.each { |item|
(hash[item[:day]] ||= []) << item
}
ソートされていないハッシュが変数で言うと foo
、あなたはそれを並べ替えることができます、
Hash[foo.sort]
回答№3の場合は0
簡単な答え:
data = [
{:day=>4,:name=>"Jay"},
{:day=>1,:name=>"Ben"},
{:day=>4,:name=>"Jill"}
]
#expected solution
sol = {
1=>[{:day=>1,:name=>"Ben"}],
4=>[{:day=>4,:name=>"Jay"},{:day=>4,:name=>"Jill"}]
}
res = {}
data.each{|h|
res[h[:day]] ||= []
res[h[:day]] << h
}
p res
p res == sol #check value
p res.keys == sol.keys #check order
このソリューションの問題:ハッシュは要求どおりにソートされません。 (同じ問題があります アヌラグスソリューション)。
したがって、答えを少し変更する必要があります。
res = {}
data.sort_by{|h| h[:day]}.each{|h|
res[h[:day]] ||= []
res[h[:day]] << h
}
p res
p res == sol #check value
p res.keys == sol.keys #check order
回答№4の場合は0
Railsで使用できます OrderedHash
:
ActiveSupport::OrderedHash[arr.group_by { |a| a[:day] }.sort_by(&:first)]
更新: 実際、Ruby 1.9ではハッシュが順序付けられているため、 ActiveSupport
拡張は必要ありません:
Hash[arr.group_by { |a| a[:day] }.sort_by(&:first)]