루비에서 해시 배열을 정렬하는 방법


147

배열이 있는데 각 요소는 세 개의 키 / 값 쌍이있는 해시입니다.

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

같은 영역의 zip모든 phones가 함께 있도록 데이터를 정렬하고 싶습니다 . 루비가 쉽게 할 수있는 방법이 있습니까? will_paginate배열에서 데이터를 페이지 매김 할 수 있습니까 ?


당신은 배열을 생성하는 경우보다는는 (예를 들어) 요소, 그 대신 해시 만들기, 고려 주어지고 [city,zip]=>phonecity=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

답변:


364

단순 :

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

노트 :

사용할 때 sort_by결과를 새 변수에 할당해야합니다. array_of_hashes = array_of_hashes.sort_by{}그렇지 않으면 "bang"메소드를 사용하여 해당 위치를 수정할 수 있습니다.array_of_hashes.sort_by!{}


8
사용할 때 sort_by결과를 새 변수에 할당해야합니다. array_of_hashes = array_of_hashes.sort_by{}그렇지 않으면 "bang"방법을 사용하여 대신 수정할 수 있습니다.array_of_hashes.sort_by!{}
Andrew

11
더 짧은 :array_of_hashes.sort_by(&:zip)
Etienne

24
@Etienne : 바로 가기 .sort_by { |hsh| hsh.zip }이므로 .zip각 해시에서 메소드로 정의 된 경우에만 작동합니다 . 기본적으로 해시는 키를 메소드로 노출하지 않으므로 아마도 다른 일이있을 것 같습니다.
Gareth

강타에 주목 :array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth : ActiveRecords의 경우에, .zip그리고 [:zip]모두의 의지 작동합니다. ActiveRecord에는 두 가지 스타일이 모두 정의되어 있습니다.
Atul Vaibhav 2016 년

17
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}

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
알랭 ANDRE

4

배열의 데이터를 페이지 매김 하려면 컨트롤러에서 'will_paginate / array'필요 합니다


2

당신이있는 경우 중첩 된 해시 (여기 날짜) 배열 요소 (다음과 같은 구조)로 (해시 형식 내부 해시)과 키를 정렬하려면

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

Array 'sort_by'메소드를 다음과 같이 사용하십시오.

data.sort_by { |element| element.keys.first }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.