对日期为键的哈希进行排序。 (红宝石1.8.7)

时间:2018-03-01 07:26:41

标签: ruby sorting hash

我想按日期将日期作为键的哈希值按升序排序。我的哈希是:

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}}

1 个答案:

答案 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