我想按日期将日期作为键的哈希值按升序排序。我的哈希是:
date_hash = {"2018-02-09"=>{"12"=>0},
"2018-02-08"=>{"12"=>0},
"2018-01-09"=>{"12"=>0}}
我试过了:
Hash[date_hash.sort_by{|k, _| k.to_date}]
但没有运气。它给出了输出:
{"2018-01-09"=>{"12"=>0},
"2018-02-09"=>{"12"=>0},
"2018-02-08"=>{"12"=>0}}
奇怪的是我注意到date_hash
在定义之后就是一个排序的哈希!为什么哈希不是按照我定义的顺序进行的?
in irb
>> date_hash = {"2018-02-09"=>{"12"=>0},"2018-02-08"=>{"12"=>0},"2018-01-09"=>{"12"=>0}}
=> {"2018-01-09"=>{"12"=>0}, "2018-02-08"=>{"12"=>0}, "2018-02-09"=>{"12"=>0}}
答案 0 :(得分:4)
经验法则:当存在旧的普通红宝石方法时,不要使用Rails废话。
date_hash.sort_by { |k, _| Date.parse k }.to_h
#⇒ {"2018-01-09"=>{"12"=>0},
# "2018-02-08"=>{"12"=>0},
# "2018-02-09"=>{"12"=>0}}
或者,即使没有约会:
date_hash.sort_by { |k, _| k.split('-').map(&:to_i) }.to_h
甚至是格式如下的日期:
date_hash.sort_by(&:first).to_h
由@StefanPochmann提出,更短,也许更清洁:
date_hash.sort.to_h