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

问题描述 投票:-1回答:1

我想按升序对日期为键的哈希进行排序。我的哈希是:

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在它定义之后就作为一个排序的哈希来了!为什么哈希不是按照我定义的顺序进行的?

在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}}
ruby sorting hash
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.