如何按日期在Rails中的Ruby中对二维数组(二维数组)进行排序?

时间:2019-09-17 10:51:20

标签: ruby-on-rails arrays ruby sorting multidimensional-array

我有一个具有以下结构的二维数组

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 之后,我没有找到任何解决方案。 谁能帮我解决我的问题?谢谢

3 个答案:

答案 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!,请注意爆炸(!):

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]
相关问题