的另一种方式,它不需要转换日期字符串到日期的对象,是以下内容。
代码
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" }]
说明
对于在例如arr
,sort_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"]
没有必要将字符串元素转换为整数。
什么是不关于上述?只要放下'.collect',如果你想修改它,添加'!'到'sort_by'。 – 2015-02-11 20:05:51
我认为这是其中OP已经有工作代码并希望知道是否有更优雅的方式的那些帖子之一,但OP应该更努力地向读者说明这一点。 – 2015-02-11 20:09:53
感谢@PhilipHallstrom,它做到了。我有点困惑,虽然我原来的尝试没有重新排序原始数组,但它听起来应该有? – CatsLoveJazz 2015-02-11 20:11:51