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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对日期为键的哈希进行排序。 (红宝石1.8.7)相关的知识,希望对你有一定的参考价值。

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

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

经验法则:当存在旧的好的普通红宝石方法时,不要使用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

以上是关于对日期为键的哈希进行排序。 (红宝石1.8.7)的主要内容,如果未能解决你的问题,请参考以下文章

ruby 关于红宝石的冥想哈希与触发器作为键的“dinamic条件”

如何在Android中转换以日期为键的JSON [重复]

按日期属性对 powershell 哈希表进行排序

在嵌入式红宝石中排序

boost::unordered_map 中以结构为键的 boost 变体

删除以结构为键的地图时出现分段错误