Як сортувати масив хешів у рубіні


147

У мене є масив, кожен з елементів якого є хеш з трьома парами ключ / значення:

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

Я хотів би відсортувати дані zipтак, щоб усі phoneв одній області були разом. Чи є у Рубі простий спосіб зробити це? Чи можна will_paginateпагінувати дані в масиві?


Якщо ви генеруєте масив, замість того, щоб це був заданий, подумайте про те, щоб зробити його хешем, з елементами (наприклад) [city,zip]=>phoneабо city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

Відповіді:


364

Символи:

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

Примітка:

Під час використання sort_byпотрібно призначити результат новій змінній: array_of_hashes = array_of_hashes.sort_by{}інакше ви можете скористатися методом "баг" для зміни на місці: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
@Etienne: Це ярлик для, .sort_by { |hsh| hsh.zip }і він працюватиме лише тоді, коли .zipвизначено як метод на кожному хеші. За замовчуванням хеші не розкривають свої ключі як методи, тому, мабуть, у вас там, мабуть, щось інше відбувається.
Гарет

Зверніть увагу на удар:array_of_hashes.sort_by!(&:zip)
Дієго Д

@Gareth: У разі ActiveRecords .zipі те , і [:zip]інше буде працювати. У ActiveRecords визначено обидва стилі.
Атул Вайбхав


10

Використовуйте вибух для зміни масиву на місці:

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! Ви припускаєте, що у Хеша є методи, що відображають атрибути ..
Andre Figueiredo

1
Дякую за reverseметод: p
Ален Андре

4

Якщо ви хочете пагінувати дані в масиві, вам потрібно зажадати "will_paginate / array" у своєму контролері


2

Якщо ви ввели Nested Hash (хеш всередині хеш-формату) як елементи масиву (така структура, як нижче), і хочете сортувати його за клавішею (дата тут)

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 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.