所以我从数据库中获得了这个对象数组,我必须对其进行排序:
我已经尝试了全部三个反向操作,但是我需要的是最后一个不应该反向(DESC),这是我的代码:
new_data = data.sort_by{ |t| [t.score, t.matches_count, t.name] }.reverse
结果
[
{
"id": null,
"team_id": 939,
"name": "DAV",
"matches_count": 2,
"score": 100.0
},
{
"id": null,
"team_id": 964,
"name": "SAN",
"matches_count": 1,
"score": 100.0
},
{
"id": null,
"team_id": 955,
"name": "PAS",
"matches_count": 1,
"score": 100.0
},
{
"id": null,
"team_id": 954,
"name": "PAR",
"matches_count": 1,
"score": 100.0
},
{
"id": null,
"team_id": 952,
"name": "NUE",
"matches_count": 1,
"score": 100.0
}
]
预期结果应按ASC顺序按名称排序,而不是按DESC排序我知道我的代码是错误的,因为t.name
在.reverse
内部,但是如果我将在{前2个我会得到错误的答案,它只会按名称排序而不是按3个排序。我也曾尝试从查询中name
,所以在反向查询时它将变为ASC,但没有运气。谢谢!
答案 0 :(得分:1)
data = [{:score=>100.0, :matches_count=>2, :name=>"DAV"},
{:score=>100.0, :matches_count=>1, :name=>"SAN"},
{:score=>100.0, :matches_count=>1, :name=>"PAS"},
{:score=>110.0, :matches_count=>1, :name=>"PAR"},
{:score=>100.0, :matches_count=>1, :name=>"NUE"}]
data.sort_by{ |h| [-h[:score], -h[:matches_count], h[:name]] }
#=> [{:score=>110.0, :matches_count=>1, :name=>"PAR"},
# {:score=>100.0, :matches_count=>2, :name=>"DAV"},
# {:score=>100.0, :matches_count=>1, :name=>"NUE"},
# {:score=>100.0, :matches_count=>1, :name=>"PAS"},
# {:score=>100.0, :matches_count=>1, :name=>"SAN"}]
您也可以使用Array#sort,只要值是可比较的,即只要它们对方法{{1 }}。
:<=>
答案 1 :(得分:0)
除了使用-
之外,还可以尝试使用!
进行排序,如下所示:https://www.ruby-forum.com/t/sort-by-multiple-fields-with-reverse-sort/197361/2
因此,您可以这样做:
new_data = data.sort_by{ |t| [!t.score, !t.matches_count, t.name] }
应该可以为您带来预期的结果。