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


147

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

:phone => "2130001111", :zip => "12345", :city => "sometown"

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


如果要生成数组,而不是给定数组,请考虑使用元素(例如)[city,zip]=>phone或使其成为哈希city=>{zip1=>[<phones>], zip2=>...}
卡里·斯沃夫兰

Answers:


364

简单:

array_of_hashes.sort_by { |hsh| hsh[:zip] }

注意:

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


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

11
甚至更短:array_of_hashes.sort_by(&:zip)
Etienne

24
@Etienne:这是它的快捷方式.sort_by { |hsh| hsh.zip },因此只有.zip在每个Hash上都将其定义为方法时,它才有效。默认情况下,哈希不会将其键公开为方法,因此我想您可能还有其他事情在进行。
Gareth 2013年

请注意爆炸:array_of_hashes.sort_by!(&:zip)
迭戈D

@Gareth:在ActiveRecords的情况下,.zip并且[:zip]两者都可以胜任。ActiveRecords都定义了两种样式。
Atul Vaibhav

17
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}

10

使用bang修改数组的位置:

array_of_hashes.sort_by!(&:zip)

或重新分配:

array_of_hashes = array_of_hashes.sort_by(&:zip)

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

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

array_of_hashes.sort_by!(&:zip).reverse!

要么

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse

6
该符号&:是的捷径method,而不是attribute!你是假设散列具有反射属性的方法..
安德烈·菲格雷多

1
感谢您的reverse方法:p
阿兰·安德烈

4

如果要对数组中的数据进行分页,则应在控制器中要求“ will_paginate / array”


2

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

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

使用数组“ sort_by”方法作为

data.sort_by { |element| element.keys.first }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.