在rails中将键为"YYYY-MM"的哈希值排序

ssn*_*egi 2 ruby

我有一个哈希,其格式为密钥"YYYY-MM".

我想按升序对哈希进行排序.以下是我想要的:

{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }
Run Code Online (Sandbox Code Playgroud)

hir*_*lau 6

require 'Date'
my_hash = {"2013-10" => 2 , "2013-06" => 4 , "2013-07" =>10}

new_hash = Hash[my_hash.sort_by{|k,_| Date.strptime(k, '%Y-%m')}]
p new_hash # => {"2013-06"=>4, "2013-07"=>10, "2013-10"=>2}
Run Code Online (Sandbox Code Playgroud)

如果您希望输出为数组,则删除Hash []部分.如果使用Ruby <= 1.8.7(在旧版本的Ruby中,哈希没有定义的顺序),则需要执行此操作.

编辑:有两个原因可以解释为什么通过解析日期而不仅仅是对字符串进行排序.第一个是验证,要检查散列中的日期字符串是否实际上是正确的格式.第二个是它还将处理并正确排序几个月没有添加零."2013-06"和"2013-6"将被视为相同,如果您只使用字符串排序,则情况并非如此.