如何在ruby中对哈希数组进行排序

jpw*_*ynn 141 ruby arrays sorting

我有一个数组,其每个元素都是一个带有三个键/值对的哈希:

:phone => "2130001111", :zip => "12345", :city => "sometown"
Run Code Online (Sandbox Code Playgroud)

我想对数据进行排序,zip因此phone同一区域中的所有s都在一起.Ruby有一个简单的方法吗?可以will_paginate在数组中分页数据吗?

Gar*_*eth 351

Simples:

array_of_hashes.sort_by { |hsh| hsh[:zip] }
Run Code Online (Sandbox Code Playgroud)

注意:

使用时,sort_by您需要将结果分配给新变量:array_of_hashes = array_of_hashes.sort_by{}否则您可以使用"bang"方法进行适当修改:array_of_hashes.sort_by!{}

  • @Etienne:这是`.sort_by {| hsh |的捷径 hsh.zip}`所以只有在每个Hash上定义`.zip`作为方法时它才会起作用.默认情况下,哈希不会将其键作为方法公开,所以我猜你可能还有其他东西在那里. (23认同)
  • 更短:`array_of_hashes.sort_by(&:zip)` (11认同)
  • 当使用`sort_by`时,你需要将结果赋值给一个新变量:`array_of_hashes = array_of_hashes.sort_by {}`否则你可以使用"bang"方法进行修改:`array_of_hashes.sort_by!{}` (7认同)

Edu*_*Edu 17

sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}
Run Code Online (Sandbox Code Playgroud)


Die*_*o D 10

使用bang来修改数组:

array_of_hashes.sort_by!(&:zip)
Run Code Online (Sandbox Code Playgroud)

或重新分配:

array_of_hashes = array_of_hashes.sort_by(&:zip)
Run Code Online (Sandbox Code Playgroud)

请注意,sort_by方法将按升序排序.

如果您需要按降序排序,您可以执行以下操作:

array_of_hashes.sort_by!(&:zip).reverse!
Run Code Online (Sandbox Code Playgroud)

要么

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse
Run Code Online (Sandbox Code Playgroud)

  • 符号`&:`是`method`的快捷方式,而不是`属性`!你假设Hash有反映属性的方法. (5认同)

Abh*_*bhi 5

如果您将嵌套哈希(哈希格式内的哈希)作为数组元素(如下所示的结构)并希望按键(此处为日期)对其进行排序

data =  [
    {
        "2018-11-13": {
            "avg_score": 4,
            "avg_duration": 29.24
        }
    },
    {
         "2017-03-13": {
            "avg_score": 4,
            "avg_duration": 40.24
        }
    },
    {
         "2018-03-13": {
            "avg_score": 4,
            "avg_duration": 39.24
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

使用数组“sort_by”方法作为

data.sort_by { |element| element.keys.first }
Run Code Online (Sandbox Code Playgroud)