【问题标题】:How to sort a two-dimensional array (2d array) by date in ruby on rails?如何在 ruby​​ on rails 中按日期对二维数组(二维数组)进行排序?
【发布时间】:2020-01-18 05:26:59
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用sort_by 方法对二维数组进行排序:sort_by 默认按升序排序。如果您希望它按降序排列,只需反转结果即可。

    array.sort_by{ |a| a.first }.reverse
    

    【讨论】:

    • 我现在试过了,但没有用,数组中没有任何变化,仍然相同。 @demir
    • @JosephNehme 此代码返回一个数组。您需要将返回的值重新分配给array 变量。试试这个:array = array.sort_by{ |a| a.first }.reverse
    • @JosephNehme 如果要改变当前数组,请改用 sort_by! 和 reverse!。
    • sort_by { |a| a.first }也可以写成sort_by(&:first)
    • 你甚至不需要使用sort_by。无论如何,数组都按它们的第一个元素排序(然后按它们的第二个元素,...)。
    【解决方案2】:

    我建议将字符串转换为Date 对象并用于排序:

    Date.strptime("2019-09-15", '%Y-%m-%d').class
    #=> Sun, 15 Sep 2019
    

    见Rails ActiveSupport Time Parsing?


    因此,如果要更改原始数组,请使用 Array#sort!,注意 bang (!):
    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]
    

    【讨论】:

      【解决方案3】:

      两个重要说明:

      • 您的日期以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!
      

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 2017-05-25
        • 2015-09-17
        相关资源
        最近更新 更多