Làm thế nào để sắp xếp một mảng băm trong ruby


147

Tôi có một mảng, mỗi phần tử có một hàm băm với ba cặp khóa / giá trị:

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

Tôi muốn sắp xếp dữ liệu theo zipđể tất cả các phones trong cùng một khu vực được kết hợp với nhau. Ruby có một cách dễ dàng để làm điều đó? Có thể will_paginatephân trang dữ liệu trong một mảng?


Nếu bạn đang tạo mảng, thay vì là một mảng nhất định, hãy xem xét biến nó thành một hàm băm thay thế, với các phần tử (ví dụ) [city,zip]=>phonehoặc city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

Câu trả lời:


364

Đơn giản:

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

Ghi chú:

Khi đang sử dụng sort_by bạn cần gán kết quả cho một biến mới: array_of_hashes = array_of_hashes.sort_by{}nếu không, bạn có thể sử dụng phương thức "bang" để sửa đổi tại chỗ:array_of_hashes.sort_by!{}


8
Khi sử dụng, sort_bybạn cần gán kết quả cho một biến mới: array_of_hashes = array_of_hashes.sort_by{}nếu không, bạn có thể sử dụng phương thức "bang" để sửa đổi tại chỗ:array_of_hashes.sort_by!{}
Andrew

11
Thậm chí ngắn hơn:array_of_hashes.sort_by(&:zip)
Etienne

24
@Etienne: Đó là một lối tắt cho .sort_by { |hsh| hsh.zip }và vì vậy nó sẽ chỉ hoạt động nếu .zipđược định nghĩa là một phương thức trên mỗi Hash. Theo mặc định, băm không để lộ khóa của họ dưới dạng phương thức, vì vậy tôi đoán có lẽ bạn đã có một cái gì đó khác đang diễn ra ở đó.
Gareth

Lưu ý tiếng nổ:array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth: Trong trường hợp ActiveRecords, .zip[:zip]cả hai sẽ hoạt động. ActiveRecords có cả hai kiểu được xác định.
Atul Vaibhav


10

Sử dụng bang để sửa đổi tại chỗ mảng:

array_of_hashes.sort_by!(&:zip)

Hoặc gán lại nó:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Lưu ý rằng phương thức sort_by sẽ sắp xếp theo thứ tự tăng dần.

Nếu bạn cần sắp xếp theo thứ tự giảm dần, bạn có thể làm một cái gì đó như thế này:

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

hoặc là

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

6
Các ký hiệu &:là một phím tắt cho method, không attribute! Bạn đang cho rằng Hash có các phương thức phản ánh các thuộc tính ..
Andre Figueiredo

1
Cảm ơn reversephương pháp: p
Alain ANDRE

4

Nếu bạn muốn phân trang cho dữ liệu trong mảng, bạn nên yêu cầu 'will_paginate / mảng' trong bộ điều khiển của bạn


2

Nếu bạn có Nested Hash (Hash bên trong định dạng băm) dưới dạng các phần tử Array (cấu trúc như sau) và muốn sắp xếp nó theo khóa (ngày ở đây)

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

Sử dụng phương thức Array 'sort_by' như

data.sort_by { |element| element.keys.first }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.