我有一个包含许多哈希数组的对象,其中一个我想按'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'方式。感谢
答案 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" }]
<强>解释强>
对于示例中的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"]
代表arr
的其他两个元素。
如果查看Array#<=>的文档,您会看到这三个数组的排序如下:
["1970", "04", "01"] < ["1975", "04", "03"] < ["1980", "09", "23"]
无需将字符串元素转换为整数。