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.