对日期为键的哈希进行排序。 (红宝石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条件”