2016-03-03 47 views
1

我有一个散列数组。Ruby中的散列数组 - 删除不需要的内容

每个哈希有3个键值(计划号,时间)

所以这将是这样的:

[0]{plan => "my_plan", number=> 1234, time =>"2016-03-02T13:56:02.000-05:00" } 
[1]{plan => "my_plan", number=> 1234, time =>"2016-03-02T14:56:02.000-05:00" } 
[2]{plan => "my_plan", number=> 1234, time =>"2016-03-02T13:59:02.000-05:00" } 
[3]{plan => "my_plan", number=> 1234, time =>"2016-03-02T12:56:02.000-05:00" } 
[4]{plan => "my_plan", number=> 4444, time =>"2016-03-02T16:42:02.000-05:00" } 
[5]{plan => "my_plan", number=> 4444, time =>"2016-03-02T16:45:02.000-05:00" } 
[6]{plan => "my_plan", number=> 4444, time =>"2016-03-02T16:44:02.000-05:00" } 
[7]{plan => "my_plan", number=> 4444, time =>"2016-03-02T16:50:02.000-05:00" } 

等等等等

我想保持与最新的那些时间(最长时间)。

所以其中的数字“1234”,我想保留此行:

{plan => "my_plan", number=> 1234, time =>"2016-03-02T14:56:02.000-05:00" } 

,并丢弃其余部分。

而对于数字“4444”,我要不断:

{plan => "my_plan", number=> 4444, time =>"2016-03-02T16:50:02.000-05:00" } 

,因为它是一个与该号码

回答

4
input = [ 
    {plan: "my_plan", number: 1234, time: "2016-03-02T13:56:02.000-05:00" }, 
    {plan: "my_plan", number: 1234, time: "2016-03-02T14:56:02.000-05:00" }, 
    {plan: "my_plan", number: 1234, time: "2016-03-02T13:59:02.000-05:00" }, 
    {plan: "my_plan", number: 1234, time: "2016-03-02T12:56:02.000-05:00" }, 
    {plan: "my_plan", number: 4444, time: "2016-03-02T16:42:02.000-05:00" }, 
    {plan: "my_plan", number: 4444, time: "2016-03-02T16:45:02.000-05:00" }, 
    {plan: "my_plan", number: 4444, time: "2016-03-02T16:44:02.000-05:00" }, 
    {plan: "my_plan", number: 4444, time: "2016-03-02T16:50:02.000-05:00" } 
] 

input.group_by { |e| e[:number] } 
    .values 
    .map { |vals| vals.sort_by { |e| e[:time] }.last } 

#⇒ [ 
# [0] { 
# :number => 1234, 
#  :plan => "my_plan", 
#  :time => "2016-03-02T14:56:02.000-05:00" 
# }, 
# [1] { 
# :number => 4444, 
#  :plan => "my_plan", 
#  :time => "2016-03-02T16:50:02.000-05:00" 
# } 
# ] 

无论您可以自由使用辉煌Hashie::Mash实现最大的日期,它更表现:

require 'hashie' 
input.map { |h| Hashie::Mash.new(h) } 
    .group_by(&:number) 
    .values 
    .map { |vals| vals.sort_by(&:time).last } 

NB datetime值是否可能在不同的时区,它的安全分选前明确字符串转换为Time实例:

input.group_by { |e| e[:number] } 
    .values 
    .map { |vals| vals.sort_by { |e| Time.parse e[:time] }.last } 
+0

非常漂亮的伟大工程。谢谢 – user3437721

相关问题