我有一个具有以下结构的二维数组
array = [
["2019-03-11","00986587","LBP"],
["2019-02-23","00462421","USD"],
["2019-05-26","00357853","EUR"],
["2019-09-15","00357382","LBP"]
]
我想根据日期(每行的第一个元素)对数组进行排序。
正在寻找以下结果:
array = [
["2019-09-15","00357382","LBP"],
["2019-05-26","00357853","EUR"],
["2019-03-11","00986587","LBP"],
["2019-02-23","00462421","USD"]
]
在研究 sort 和 sort_by 之后,我没有找到任何解决方案。 谁能帮我解决我的问题?谢谢
答案 0 :(得分:5)
您可以使用sort_by方法对2d数组进行排序:sort_by
默认按升序排序。如果希望它按降序排列,只需反转结果即可。
array.sort_by{ |a| a.first }.reverse
答案 1 :(得分:2)
两个重要说明:
YYYY-MM-DD
格式编写,因此按字母顺序对其进行排序也将按时间顺序对其进行排序。这意味着您只需要:
array.sort.reverse
#=> => [["2019-09-15", "00357382", "LBP"], ["2019-05-26", "00357853", "EUR"], ["2019-03-11", "00986587", "LBP"], ["2019-02-23", "00462421", "USD"]]
如果要将修改array
保存到位,可以编写:
array.sort!.reverse!
答案 2 :(得分:1)
我建议将字符串转换为Date
对象,并将其用于排序:
Date.strptime("2019-09-15", '%Y-%m-%d').class
#=> Sun, 15 Sep 2019
请参见Rails ActiveSupport Time Parsing?
!
):
array.sort! { |(date_1, *rest_1), (date_2, *rest_2)| Date.strptime(date_2, '%Y-%m-%d') <=> Date.strptime(date_1, '%Y-%m-%d') }
array
#=> [["2019-09-15", "00357382", "LBP"], ["2019-05-26", "00357853", "EUR"], ["2019-03-11", "00986587", "LBP"], ["2019-02-23", "00462421", "USD"]]
以相反的顺序更改块:
Date.strptime(date_1, '%Y-%m-%d') <=> Date.strptime(date_2, '%Y-%m-%d')
*splat
运算符,它的工作方式如下:
ary = [1,2,3]
a, *b = ary
p a, b
# 1
# [2, 3]