【问题标题】:How to sort an array of Integer and OpenStruct objects by a key of one of the OpenStruct Keys如何通过 OpenStruct 键之一的键对 Integer 和 OpenStruct 对象数组进行排序
【发布时间】:2016-10-20 21:17:53
【问题描述】:

我刚刚学习 Ruby 并开始使用数组。我有一个看起来像这样的数组:

easyStats = [<SampleArray: @id=0, @stats=#<OpenStruct total_sessions_played=244, total_sessions_lost=124>>, 
             <SampleArray: @id=1, @stats=#<OpenStruct total_sessions_played=204, total_sessions_lost=129>>, 
             <SampleArray: @id=2, @stats=#<OpenStruct total_sessions_played=2, total_sessions_lost=4>>]

我可以按 id(整数)属性对数组进行排序:

easyStats.sort_by(&:id)

但是,我想做的是通过 OpenStruct 对象的键对数组进行排序,我尝试了以下选项,但出现了不同的错误:

easyStats.sort_by(&:stats)

错误:OpenStruct 与 OpenStruct 的比较失败

easyStats.sort_by(&:stats[:total_sessions_played])

错误:没有将 Symbol 隐式转换为 Integer

easyStats[:stats].sort_by(&:total_sessions_played)

错误:没有将 Symbol 隐式转换为 Integer

我已经看到了有关如何对仅包含一个 OpenStruct 对象的数组进行排序的解决方案,我想我理解了 - How to sort a ruby array by two conditions

有人可以告诉我如何按此示例中的 OpenStruct 对象的任何键进行排序(带有 Integer 和 OpenStruct 对象的数组)吗?

【问题讨论】:

    标签: ruby-on-rails arrays ruby sorting ruby-on-rails-4


    【解决方案1】:

    您应该提供一个实际的块(因为您在每个项目上连续调用两个方法):

    easyStats.sort_by{|x| x.stats.total_sessions_played}
    

    因此,您不能在此处真正使用带有 &amp; 的短符号。

    【讨论】:

      【解决方案2】:

      sort_by 方法接受一个块并使用该块的返回值作为排序依据。在您的情况下,您可以通过以下方式访问该值:

      easyStats.sort_by { |i| i.stats.total_sessions_played }
      

      .sort_by(&amp;:key) 代码实际上只是 .sort_by { |i| i.key } 的简写。并且您只能在块包含在块参数上调用的单个方法时使用它。您可以阅读更多关于它的工作原理和原因here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2019-10-08
        • 2012-08-15
        • 2019-05-13
        • 2012-11-15
        • 1970-01-01
        相关资源
        最近更新 更多