2016-03-03 36 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

相關問題