按日期字段对哈希数组进行排序

时间:2015-02-11 20:01:22

标签: ruby sorting hash

我有一个包含许多哈希数组的对象,其中一个我想按'date'键中的值排序。

 @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和collect的各种方法,但无法找到一个好的解决方案。

修改  为了清楚起见,我想对原始数组进行排序

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

如何以优雅的方式解决这个'Ruby-ist'方式。感谢

2 个答案:

答案 0 :(得分:4)

整体看起来很好。虽然您可以放弃collect调用,因为它不需要,并使用sort_by!来就地修改数组(而不是重新分配):

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

答案 1 :(得分:2)

另一种不需要将日期字符串转换为日期对象的方法如下:

<强>代码

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_byarr的第一个元素传递到其块中,并将其分配给块变量:

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"]

代表arr的其他两个元素。

如果查看Array#<=>的文档,您会看到这三个数组的排序如下:

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

无需将字符串元素转换为整数。