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?


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!{}


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

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

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


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 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.