So sortieren Sie eine Reihe von Hashes in Rubin

147

Ich habe ein Array, dessen Elemente jeweils ein Hash mit drei Schlüssel / Wert-Paaren sind:

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

Ich möchte die Daten zipso sortieren, dass alle phones im selben Bereich zusammen sind. Hat Ruby eine einfache Möglichkeit, das zu tun? Kann will_paginateDaten in einem Array paginieren?

jpw
quelle
Wenn Sie das Array generieren, anstatt es als gegeben zu betrachten, sollten Sie es stattdessen als Hash mit Elementen (zum Beispiel) [city,zip]=>phoneoder festlegen city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

Antworten:

364

Beispiele:

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

Hinweis:

Bei der Verwendung müssen sort_bySie das Ergebnis einer neuen Variablen zuweisen. array_of_hashes = array_of_hashes.sort_by{}Andernfalls können Sie die "Bang" -Methode verwenden, um Änderungen an Ort und Stelle vorzunehmen:array_of_hashes.sort_by!{}

Gareth
quelle
8
Wenn sort_bySie verwenden, müssen Sie das Ergebnis einer neuen Variablen zuweisen. array_of_hashes = array_of_hashes.sort_by{}Andernfalls können Sie die "Bang" -Methode verwenden, um Folgendes zu ändern:array_of_hashes.sort_by!{}
Andrew
11
Noch kürzer:array_of_hashes.sort_by(&:zip)
Etienne
24
@Etienne: Das ist eine Abkürzung für .sort_by { |hsh| hsh.zip }und funktioniert daher nur, wenn .zipsie für jeden Hash als Methode definiert ist. Standardmäßig machen Hashes ihre Schlüssel nicht als Methoden verfügbar, also haben Sie wahrscheinlich noch etwas anderes vor.
Gareth
Beachten Sie den Knall:array_of_hashes.sort_by!(&:zip)
Diego D
@Gareth: Bei ActiveRecords, .zipund [:zip]beide arbeiten. Bei ActiveRecords sind beide Stile definiert.
Atul Vaibhav
17
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}
Edu
quelle
10

Verwenden Sie den Knall, um das Array an Ort und Stelle zu ändern:

array_of_hashes.sort_by!(&:zip)

Oder ordnen Sie es neu zu:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Beachten Sie, dass die Methode sort_by nach aufsteigender Reihenfolge sortiert wird.

Wenn Sie in absteigender Reihenfolge sortieren müssen, können Sie Folgendes tun:

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

oder

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse
Diego D.
quelle
6
Die Notation &:ist eine Abkürzung für method, nicht attribute! Sie nehmen an, dass der Hash Methoden hat, die Attribute widerspiegeln.
Andre Figueiredo
1
Vielen Dank für die reverseMethode: p
Alain ANDRE
4

Wenn Sie nach Daten im Array paginieren möchten, sollten Sie in Ihrem Controller 'will_paginate / array' benötigen

taivn07
quelle
2

Wenn Sie Nested Hash (Hash in einem Hash-Format) als Array-Elemente (eine Struktur wie die folgende) haben und diese nach Schlüssel sortieren möchten (Datum hier)

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

Verwenden Sie die Array-Methode 'sort_by' als

data.sort_by { |element| element.keys.first }
Abhi
quelle