多字段sort_by组合的反向与非

时间:2019-08-15 09:14:16

标签: ruby-on-rails ruby api ruby-on-rails-5

所以我从数据库中获得了这个对象数组,我必须对其进行排序:

  1. 按分数(反向)
  2. 按计数(反向)
  3. 按名称

我已经尝试了全部三个反向操作,但是我需要的是最后一个不应该反向(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,但没有运气。谢谢!

2 个答案:

答案 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] }

应该可以为您带来预期的结果。