2015-02-11 77 views
1

我有一個包含許多散列數組的對象,其中一個我想按「日期」鍵中的值排序。按日期字段對散列數組排序

@array['info'][0] = {"name"=>"personA", "date"=>"23/09/1980"} 
@array['info'][1] = {"name"=>"personB", "date"=>"01/04/1970"} 
@array['info'][2] = {"name"=>"personC", "date"=>"03/04/1975"} 

我已經嘗試過使用Date.parse和收集但不能找到一個好的解決方案的各種方法。

編輯: 要清楚我要到位

@array['info'].sort_by { |i| Date.parse i['date'] }.collect 

原始數組排序一個會如何解決這個優雅的「紅寶石-IST」的方式。謝謝

+3

什麼是不關於上述?只要放下'.collect',如果你想修改它,添加'!'到'sort_by'。 – 2015-02-11 20:05:51

+0

我認爲這是其中OP已經有工作代碼並希望知道是否有更優雅的方式的那些帖子之一,但OP應該更努力地向讀者說明這一點。 – 2015-02-11 20:09:53

+0

感謝@PhilipHallstrom,它做到了。我有點困惑,雖然我原來的嘗試沒有重新排序原始數組,但它聽起來應該有? – CatsLoveJazz 2015-02-11 20:11:51

回答

1

的另一種方式,它不需要轉換日期字符串到日期的對象,是以下內容。

代碼

def sort_by_date(arr) 
    arr.sort_by { |h| h["date"].split('/').reverse } 
end 

如果arr在適當的位置進行排序,用Array#sort_by!而非Enumerable#sort_by

arr = [{ "name"=>"personA", "date"=>"23/09/1980" }, 
     { "name"=>"personB", "date"=>"01/04/1970" }, 
     { "name"=>"personC", "date"=>"03/04/1975" }] 

sort_by_date(arr) 
    #=> [{ "name"=>"personB", "date"=>"01/04/1970" }, 
    # { "name"=>"personC", "date"=>"03/04/1975" }, 
    # { "name"=>"personA", "date"=>"23/09/1980" }] 

說明

對於在例如arrsort_by傳遞的arr到其塊中的第一個元素,並將其分配給塊變量:

h = { "name"=>"personA", "date"=>"23/09/1980" } 

然後計算:

a = h["date"].split('/') 
    #=> ["23", "09", "1980"] 

然後:

b = a.reverse 
    #=> ["1980", "09", "23"] 

類似地,我們得到b等於:

["1970", "04", "01"] 

["1975", "04", "03"] 

每個其它兩個的的元素。

如果你看一下文檔的Array#<=>你會看到,這三個數組排序如下:

["1970", "04", "01"] < ["1975", "04", "03"] < ["1980", "09", "23"] 

沒有必要將字符串元素轉換爲整數。

2

整體看起來不錯。雖然你可以刪除collect調用,因爲它是沒有必要的,並使用sort_by!修改就地數組(而不是重新分配):

@array['info'].sort_by! { |x| Date.parse x['date'] } 
+0

完美,謝謝。我顯然被誤解了,但我認爲收集會爲我做到這一點,我不需要sort_by! – CatsLoveJazz 2015-02-11 20:44:37