首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过一个OpenStruct键对整数和OpenStruct对象数组进行排序

如何通过一个OpenStruct键对整数和OpenStruct对象数组进行排序
EN

Stack Overflow用户
提问于 2016-06-19 15:01:57
回答 2查看 1.3K关注 0票数 1

我只是在学习Ruby,并开始使用数组。我有一个数组,看起来像:

代码语言:javascript
复制
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 (Integer)属性排序如下:

代码语言:javascript
复制
easyStats.sort_by(&:id)

但是,我想要做的是根据OpenStruct对象的一个键对数组进行排序,我尝试了以下带有不同错误的选项:

代码语言:javascript
复制
easyStats.sort_by(&:stats)

错误: OpenStruct与OpenStruct的比较失败

代码语言:javascript
复制
easyStats.sort_by(&:stats[:total_sessions_played])

错误:没有将符号隐式转换为整数

代码语言:javascript
复制
easyStats[:stats].sort_by(&:total_sessions_played)

错误:没有将符号隐式转换为整数

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

在这个例子中,有人能告诉我如何按OpenStruct对象的任意键排序( Integer和OpenStruct对象的数组)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-19 15:15:51

sort_by方法接受一个块并使用该块的返回值作为排序的键。在您的示例中,您可以通过执行以下操作来访问该值:

代码语言:javascript
复制
easyStats.sort_by { |i| i.stats.total_sessions_played }

.sort_by(&:key)代码实际上只是.sort_by { |i| i.key }的缩写。只有当块由块参数上调用的单个方法组成时,才能使用它。您可以阅读更多关于它如何和为什么工作的here

票数 4
EN

Stack Overflow用户

发布于 2016-06-19 15:04:18

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

代码语言:javascript
复制
easyStats.sort_by{|x| x.stats.total_sessions_played}

因此,您不能在这里使用&的简短表示法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37908601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档