/ /ハッシュの配列をソート済みハッシュに変換するにはどうすればよいですか? -ruby-on-rails、ruby、配列、ハッシュ

ハッシュの配列をソートされたハッシュに変換するにはどうすればよいですか? - ruby​​-on-rails、ruby、配列、ハッシュ

ハッシュの配列があり、それぞれに曜日キーがある場合:

[
{: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)]