2015-02-11 70 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