web-dev-qa-db-fra.com

Comment trier un tableau de hachages en rubis

J'ai un tableau dont chacun des éléments est un hachage avec trois paires clé/valeur:

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

J'aimerais trier les données par Zip afin que tous les phones de la même zone soient ensemble Ruby a-t-il un moyen facile de le faire? will_paginate peut-il paginer des données dans un tableau?

129
jpwynn

Simples:

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

Remarque:

Lorsque vous utilisez sort_by, vous devez affecter le résultat à une nouvelle variable: array_of_hashes = array_of_hashes.sort_by{}, sinon vous pouvez utiliser la méthode "bang" pour modifier à la place: array_of_hashes.sort_by!{}

322
Gareth
sorted = dataarray.sort {|a,b| a[:Zip] <=> b[:Zip]}
17
Edu

Utilisez le bang pour modifier en place le tableau:

array_of_hashes.sort_by!(&:Zip)

Ou le réaffecter:

array_of_hashes = array_of_hashes.sort_by(&:Zip)

Notez que la méthode sort_by va trier par ordre croissant.

Si vous avez besoin de trier par ordre décroissant, vous pouvez faire quelque chose comme ceci:

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

ou

array_of_hashes = array_of_hashes.sort_by(&:Zip).reverse
7
Diego D

Si vous voulez paginer des données dans un tableau, vous devriez nécessite 'will_paginate/array' dans votre contrôleur

4
taivn07

Si vous avez hachage imbriqué (hachage dans un format de hachage) en tant qu'éléments de tableau (une structure semblable à celle-ci) et que vous souhaitez le trier par clé (date ici)

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

Utilisez la méthode Array 'sort_by' comme

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