Ruby'de bir dizi karma nasıl sıralanır


153

Her biri üç anahtar / değer çifti içeren bir karma olan bir dizim var:

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

Verileri sıralamak istiyorum, zipböylece phoneaynı alandaki tüm ' ler bir arada olsun. Ruby'nin bunu yapmanın kolay bir yolu var mı? Can will_paginatebir diziye veri sayfalandırmak?


Diziyi verili olmak yerine üretiyorsanız, bunun yerine öğeleriyle (örneğin) [city,zip]=>phoneveya city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

Yanıtlar:


374

Basit:

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

Not:

Kullanırken sort_bysonucu yeni bir değişkene atamanız gerekir: array_of_hashes = array_of_hashes.sort_by{}aksi takdirde yerinde değiştirmek için "bang" yöntemini kullanabilirsiniz:array_of_hashes.sort_by!{}


8
Kullanırken sort_bysonucu yeni bir değişkene atamanız gerekir: array_of_hashes = array_of_hashes.sort_by{}aksi takdirde yerinde değişiklik yapmak için "bang" yöntemini kullanabilirsiniz:array_of_hashes.sort_by!{}
Andrew

12
Daha da kısa:array_of_hashes.sort_by(&:zip)
Etienne

25
@Etienne: Bu bir kısayol .sort_by { |hsh| hsh.zip }ve bu nedenle yalnızca .zipher Hash'te bir yöntem olarak tanımlanırsa işe yarayacaktır . Varsayılan olarak hash'ler anahtarlarını yöntem olarak göstermez, bu yüzden muhtemelen orada başka bir şeyler olduğunu tahmin ediyorum.
Gareth

Patlamaya dikkat edin:array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth: ActiveRecords durumunda .zipve [:zip]her ikisi de çalışacaktır. ActiveRecords'un her iki stili de tanımlanmıştır.
Atul Vaibhav

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

10

Diziyi yerinde değiştirmek için patlamayı kullanın:

array_of_hashes.sort_by!(&:zip)

Veya yeniden atayın:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Sort_by yönteminin artan düzene göre sıralayacağını unutmayın.

Azalan düzende sıralamanız gerekirse, şöyle bir şey yapabilirsiniz:

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

veya

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

7
Gösterim &:kısayol method, değil attribute! Hash'in nitelikleri yansıtan yöntemleri olduğunu varsayıyorsunuz ..
Andre Figueiredo

1
reverseYöntem için teşekkürler : p
Alain ANDRE

4

Dizideki veriler için sayfalandırmak istiyorsanız , denetleyicinizde 'will_paginate / array' gerektirmelisiniz


3

Eğer varsa İçiçe Hash (burada tarih) Dizi elemanları (aşağıdaki gibi bir yapıya) olarak (karma biçimi içindeki karma) ve anahtar göre sıralayabilir istiyorum

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' yöntemini şu şekilde kullanın:

data.sort_by { |element| element.keys.first }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.