Rubyでハッシュの配列をソートする方法


147

私は配列を持っています。その各要素は、3つのキーと値のペアを持つハッシュです。

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

同じエリアのzipすべてのphoneが一緒になるようにデータを並べ替えたいのですが。Rubyにはそれを行う簡単な方法はありますか?will_paginate配列内のデータにページ番号を付けることはできますか?


配列ではなく、配列を生成する場合は、代わりに要素(例)[city,zip]=>phoneまたはを使用して、配列をハッシュにすることを検討してcity=>{zip1=>[<phones>], zip2=>...}ください。
Cary Swoveland、2015

回答:


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{}そうしない場所に変更する「ビッグバン」メソッドを使用することができます:array_of_hashes.sort_by!{}
アンドリュー

11
さらに短い:array_of_hashes.sort_by(&:zip)
エティエンヌ

24
@エティエンヌ:これはのショートカットで.sort_by { |hsh| hsh.zip }あり.zip、各ハッシュのメソッドとして定義されている場合にのみ機能します。デフォルトではハッシュはそれらのキーをメソッドとして公開しないので、おそらく何か他のことが起こっていると思います。
Gareth

強打に注意してください:array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth:ActiveRecordsの場合、 .zip[:zip]両方とも機能します。ActiveRecordsには両方のスタイルが定義されています。
Atul Vaibhav


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
Alain ANDRE

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 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.