วิธีเรียงลำดับแฮชในทับทิม


147

ฉันมีอาร์เรย์ซึ่งแต่ละองค์ประกอบมีแฮชที่มีคู่คีย์ / ค่าสามคู่:

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

ฉันต้องการเรียงลำดับข้อมูลzipเพื่อให้ทุกคนphoneในพื้นที่เดียวกันอยู่ด้วยกัน ทับทิมมีวิธีง่าย ๆ ในการทำเช่นนั้นหรือไม่? สามารถwill_paginateแบ่งหน้าข้อมูลในอาร์เรย์ได้หรือไม่?


หากคุณกำลังสร้างอาร์เรย์มากกว่ามันถูกให้พิจารณาทำให้กัญชาแทนด้วยองค์ประกอบ (ตัวอย่าง) หรือ[city,zip]=>phone city=>{zip1=>[<phones>], zip2=>...}
Cary Swoveland

คำตอบ:


364

Simples:

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!{}
Andrew

11
สั้นลงอีก:array_of_hashes.sort_by(&:zip)
เอเตียน

24
@Etienne: นั่นเป็นทางลัด.sort_by { |hsh| hsh.zip }ดังนั้นมันจะใช้ได้ก็ต่อเมื่อ.zipมีการกำหนดเป็นวิธีสำหรับ Hash แต่ละรายการ ตามค่าเริ่มต้นแฮชจะไม่เปิดเผยคีย์ของพวกเขาเป็นวิธีการดังนั้นฉันเดาว่าคุณคงมีบางอย่างเกิดขึ้นที่นั่น
Gareth

หมายเหตุปัง:array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth: ในกรณีของ ActiveRecords .zipและ[:zip]ทั้งคู่จะทำงาน ActiveRecords มีการกำหนดทั้งสไตล์
Atul Vaibhav


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! คุณกำลังพลที่แฮมีวิธีการสะท้อนให้เห็นถึงคุณลักษณะ ..
อังเดร Figueiredo

1
ขอบคุณสำหรับreverseวิธีการ: p
Alain 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.