रूबी में हैश की एक सरणी को कैसे सॉर्ट करें


147

मेरे पास एक सरणी है, जिसका प्रत्येक तत्व तीन प्रमुख / मूल्य युग्मों वाला एक हैश है:

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

मैं एक ही क्षेत्र में zipसभी phones को एक साथ डेटा सॉर्ट करना चाहूंगा । क्या रूबी के पास ऐसा करने का एक आसान तरीका है? क्या will_paginateकिसी ऐरे में डेटा को पेजिनेट कर सकते हैं ?


यदि आप दिए गए होने के बजाय सरणी उत्पन्न कर रहे हैं, तो तत्वों (उदाहरण के लिए) [city,zip]=>phoneया इसके बजाय इसे हैश बनाने पर विचार करें city=>{zip1=>[<phones>], zip2=>...}
कैरी स्वेवेलैंड

जवाबों:


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
@ इटेन: यह एक शॉर्टकट है .sort_by { |hsh| hsh.zip }और इसलिए यह केवल तभी काम करेगा जब .zipप्रत्येक हैश पर एक विधि के रूप में परिभाषित किया गया हो। डिफ़ॉल्ट रूप से हैश विधियों के रूप में उनकी कुंजियों को उजागर नहीं करते हैं, इसलिए मुझे लगता है कि आपको शायद कुछ और मिल रहा है।
गारेथ

धमाके पर ध्यान दें:array_of_hashes.sort_by!(&:zip)
डिएगो डी

@ गैरेथ: 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! आप मान रहे हैं कि हैश के पास विशेषताओं को दर्शाने वाली विधियाँ हैं ..
आंद्रे फिगयूरिडो

1
reverseविधि के लिए धन्यवाद : पी
एलेन आंद्रे

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 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.